FrameBuffer.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. private readonly List<long> hashs;
  12. public FrameBuffer(int capacity = LSConstValue.FrameCountPerSecond * 10)
  13. {
  14. this.MaxFrame = capacity - 1;
  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(new OneFrameInputs());
  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. if (frame < 0)
  31. {
  32. return;
  33. }
  34. if (frame > this.MaxFrame)
  35. {
  36. return;
  37. }
  38. this.hashs[frame % this.frameInputs.Capacity] = hash;
  39. }
  40. public long GetHash(int frame)
  41. {
  42. if (frame < 0)
  43. {
  44. return 0;
  45. }
  46. if (frame > this.MaxFrame)
  47. {
  48. return 0;
  49. }
  50. return this.hashs[frame % this.frameInputs.Capacity];
  51. }
  52. public OneFrameInputs FrameInputs(int frame)
  53. {
  54. if (frame < 0)
  55. {
  56. return null;
  57. }
  58. if (frame > this.MaxFrame)
  59. {
  60. return null;
  61. }
  62. OneFrameInputs oneFrameInputs = this.frameInputs[frame % this.frameInputs.Capacity];
  63. return oneFrameInputs;
  64. }
  65. public void MoveForward(int frame)
  66. {
  67. if (this.MaxFrame - frame > LSConstValue.FrameCountPerSecond) // 至少留出1秒的空间
  68. {
  69. return;
  70. }
  71. ++this.MaxFrame;
  72. OneFrameInputs oneFrameInputs = this.FrameInputs(this.MaxFrame);
  73. oneFrameInputs.Inputs.Clear();
  74. }
  75. public MemoryBuffer Snapshot(int frame)
  76. {
  77. if (frame < 0)
  78. {
  79. return null;
  80. }
  81. if (frame > this.MaxFrame)
  82. {
  83. return null;
  84. }
  85. MemoryBuffer memoryBuffer = this.snapshots[frame % this.snapshots.Capacity];
  86. return memoryBuffer;
  87. }
  88. }
  89. }