FrameBuffer.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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> messageBuffer;
  10. private readonly List<MemoryBuffer> dataBuffer;
  11. public FrameBuffer(int capacity = LSConstValue.FrameCountPerSecond * 10)
  12. {
  13. this.MaxFrame = capacity - 1;
  14. this.messageBuffer = new List<OneFrameInputs>(capacity);
  15. this.dataBuffer = new List<MemoryBuffer>(capacity);
  16. for (int i = 0; i < this.dataBuffer.Capacity; ++i)
  17. {
  18. this.messageBuffer.Add(new OneFrameInputs());
  19. MemoryBuffer memoryBuffer = new(10240);
  20. memoryBuffer.SetLength(0);
  21. memoryBuffer.Seek(0, SeekOrigin.Begin);
  22. this.dataBuffer.Add(memoryBuffer);
  23. }
  24. }
  25. public OneFrameInputs this[int frame]
  26. {
  27. get
  28. {
  29. if (frame < 0)
  30. {
  31. return null;
  32. }
  33. if (frame > this.MaxFrame)
  34. {
  35. return null;
  36. }
  37. OneFrameInputs oneFrameInputs = this.messageBuffer[frame % this.messageBuffer.Capacity];
  38. return oneFrameInputs;
  39. }
  40. }
  41. public void MoveForward(int frame)
  42. {
  43. if (this.MaxFrame - frame > LSConstValue.FrameCountPerSecond) // 至少留出1秒的空间
  44. {
  45. return;
  46. }
  47. ++this.MaxFrame;
  48. Log.Debug($"framebuffer move forward: {this.MaxFrame}");
  49. OneFrameInputs oneFrameInputs = this[this.MaxFrame];
  50. oneFrameInputs.Inputs.Clear();
  51. }
  52. public MemoryBuffer GetMemoryBuffer(int frame)
  53. {
  54. if (frame < 0)
  55. {
  56. return null;
  57. }
  58. if (frame > this.MaxFrame)
  59. {
  60. return null;
  61. }
  62. MemoryBuffer memoryBuffer = this.dataBuffer[frame % this.dataBuffer.Capacity];
  63. return memoryBuffer;
  64. }
  65. public LSWorld GetLSWorld(int frame)
  66. {
  67. MemoryBuffer memoryBuffer = GetMemoryBuffer(frame);
  68. return MongoHelper.Deserialize(typeof (LSWorld), memoryBuffer) as LSWorld;
  69. }
  70. public void SaveLSWorld(int frame, LSWorld lsWorld)
  71. {
  72. MemoryBuffer memoryBuffer = this.dataBuffer[frame % this.dataBuffer.Capacity];
  73. memoryBuffer.Seek(0, SeekOrigin.Begin);
  74. memoryBuffer.SetLength(0);
  75. MongoHelper.Serialize(lsWorld, memoryBuffer);
  76. memoryBuffer.Seek(0, SeekOrigin.Begin);
  77. }
  78. }
  79. }