FrameBuffer.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. namespace ET
  5. {
  6. public class FrameBuffer
  7. {
  8. public int MaxFrame { get; private set; }
  9. private readonly List<OneFrameInputs> frameInputs;
  10. private readonly List<MemoryBuffer> snapshots;
  11. public FrameBuffer(int capacity = LSConstValue.FrameCountPerSecond * 10)
  12. {
  13. this.MaxFrame = capacity - 1;
  14. this.frameInputs = new List<OneFrameInputs>(capacity);
  15. this.snapshots = new List<MemoryBuffer>(capacity);
  16. for (int i = 0; i < this.snapshots.Capacity; ++i)
  17. {
  18. this.frameInputs.Add(new OneFrameInputs());
  19. MemoryBuffer memoryBuffer = new(10240);
  20. memoryBuffer.SetLength(0);
  21. memoryBuffer.Seek(0, SeekOrigin.Begin);
  22. this.snapshots.Add(memoryBuffer);
  23. }
  24. }
  25. public OneFrameInputs FrameInputs(int frame)
  26. {
  27. if (frame < 0)
  28. {
  29. return null;
  30. }
  31. if (frame > this.MaxFrame)
  32. {
  33. return null;
  34. }
  35. OneFrameInputs oneFrameInputs = this.frameInputs[frame % this.frameInputs.Capacity];
  36. return oneFrameInputs;
  37. }
  38. public void MoveForward(int frame)
  39. {
  40. if (this.MaxFrame - frame > LSConstValue.FrameCountPerSecond) // 至少留出1秒的空间
  41. {
  42. return;
  43. }
  44. ++this.MaxFrame;
  45. Log.Debug($"framebuffer move forward: {this.MaxFrame}");
  46. OneFrameInputs oneFrameInputs = this.FrameInputs(this.MaxFrame);
  47. oneFrameInputs.Inputs.Clear();
  48. }
  49. public MemoryBuffer Snapshot(int frame)
  50. {
  51. if (frame < 0)
  52. {
  53. return null;
  54. }
  55. if (frame > this.MaxFrame)
  56. {
  57. return null;
  58. }
  59. MemoryBuffer memoryBuffer = this.snapshots[frame % this.snapshots.Capacity];
  60. return memoryBuffer;
  61. }
  62. }
  63. }