FrameBuffer.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. namespace ET
  5. {
  6. public class FrameBuffer: Object
  7. {
  8. public int MaxFrame { get; private set; }
  9. private readonly List<OneFrameInputs> frameInputs;
  10. private readonly List<MemoryBuffer> snapshots;
  11. private readonly List<long> hashs;
  12. public FrameBuffer(int frame = 0, int capacity = LSConstValue.FrameCountPerSecond * 60)
  13. {
  14. this.MaxFrame = frame + LSConstValue.FrameCountPerSecond * 30;
  15. this.frameInputs = new List<OneFrameInputs>(capacity);
  16. this.snapshots = new List<MemoryBuffer>(capacity);
  17. this.hashs = new List<long>(capacity);
  18. for (int i = 0; i < this.snapshots.Capacity; ++i)
  19. {
  20. this.hashs.Add(0);
  21. this.frameInputs.Add(OneFrameInputs.Create());
  22. MemoryBuffer memoryBuffer = new(10240);
  23. memoryBuffer.SetLength(0);
  24. memoryBuffer.Seek(0, SeekOrigin.Begin);
  25. this.snapshots.Add(memoryBuffer);
  26. }
  27. }
  28. public void SetHash(int frame, long hash)
  29. {
  30. EnsureFrame(frame);
  31. this.hashs[frame % this.frameInputs.Capacity] = hash;
  32. }
  33. public long GetHash(int frame)
  34. {
  35. EnsureFrame(frame);
  36. return this.hashs[frame % this.frameInputs.Capacity];
  37. }
  38. public bool CheckFrame(int frame)
  39. {
  40. if (frame < 0)
  41. {
  42. return false;
  43. }
  44. if (frame > this.MaxFrame)
  45. {
  46. return false;
  47. }
  48. return true;
  49. }
  50. private void EnsureFrame(int frame)
  51. {
  52. if (!CheckFrame(frame))
  53. {
  54. throw new Exception($"frame out: {frame}, maxframe: {this.MaxFrame}");
  55. }
  56. }
  57. public OneFrameInputs FrameInputs(int frame)
  58. {
  59. EnsureFrame(frame);
  60. OneFrameInputs oneFrameInputs = this.frameInputs[frame % this.frameInputs.Capacity];
  61. oneFrameInputs.Frame = frame;
  62. return oneFrameInputs;
  63. }
  64. public void MoveForward(int frame)
  65. {
  66. if (this.MaxFrame - frame > LSConstValue.FrameCountPerSecond) // 至少留出1秒的空间
  67. {
  68. return;
  69. }
  70. ++this.MaxFrame;
  71. OneFrameInputs oneFrameInputs = this.FrameInputs(this.MaxFrame);
  72. oneFrameInputs.Inputs.Clear();
  73. }
  74. public MemoryBuffer Snapshot(int frame)
  75. {
  76. EnsureFrame(frame);
  77. MemoryBuffer memoryBuffer = this.snapshots[frame % this.snapshots.Capacity];
  78. return memoryBuffer;
  79. }
  80. }
  81. }