using System; using System.Collections.Generic; using System.IO; namespace ET { public class FrameBuffer { public int MaxFrame { get; private set; } private readonly List frameInputs; private readonly List snapshots; private readonly List hashs; public FrameBuffer(int frame = 0, int capacity = LSConstValue.FrameCountPerSecond * 60) { this.MaxFrame = frame + LSConstValue.FrameCountPerSecond * 30; this.frameInputs = new List(capacity); this.snapshots = new List(capacity); this.hashs = new List(capacity); for (int i = 0; i < this.snapshots.Capacity; ++i) { this.hashs.Add(0); this.frameInputs.Add(new OneFrameInputs()); MemoryBuffer memoryBuffer = new(10240); memoryBuffer.SetLength(0); memoryBuffer.Seek(0, SeekOrigin.Begin); this.snapshots.Add(memoryBuffer); } } public void SetHash(int frame, long hash) { EnsureFrame(frame); this.hashs[frame % this.frameInputs.Capacity] = hash; } public long GetHash(int frame) { EnsureFrame(frame); return this.hashs[frame % this.frameInputs.Capacity]; } public bool CheckFrame(int frame) { if (frame < 0) { return false; } if (frame > this.MaxFrame) { return false; } return true; } private void EnsureFrame(int frame) { if (!CheckFrame(frame)) { throw new Exception($"frame out: {frame}, maxframe: {this.MaxFrame}"); } } public OneFrameInputs FrameInputs(int frame) { EnsureFrame(frame); OneFrameInputs oneFrameInputs = this.frameInputs[frame % this.frameInputs.Capacity]; return oneFrameInputs; } public void MoveForward(int frame) { if (this.MaxFrame - frame > LSConstValue.FrameCountPerSecond) // 至少留出1秒的空间 { return; } ++this.MaxFrame; OneFrameInputs oneFrameInputs = this.FrameInputs(this.MaxFrame); oneFrameInputs.Inputs.Clear(); } public MemoryBuffer Snapshot(int frame) { EnsureFrame(frame); MemoryBuffer memoryBuffer = this.snapshots[frame % this.snapshots.Capacity]; return memoryBuffer; } } }