From 1f84dcdeb24898a0c6eda719b66cd844bd4660ba Mon Sep 17 00:00:00 2001 From: nattthebear Date: Sat, 22 Aug 2020 14:58:35 -0400 Subject: [PATCH] zwinder rewinder - fix all sorts of funsies when the state count cap is reached --- .../rewind/ZwinderBuffer.cs | 6 ++++++ .../Movie/ZwinderStateManagerTests.cs | 21 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/BizHawk.Client.Common/rewind/ZwinderBuffer.cs b/src/BizHawk.Client.Common/rewind/ZwinderBuffer.cs index 9f6a6c8685..9ee5c7e5de 100644 --- a/src/BizHawk.Client.Common/rewind/ZwinderBuffer.cs +++ b/src/BizHawk.Client.Common/rewind/ZwinderBuffer.cs @@ -136,6 +136,12 @@ namespace BizHawk.Client.Common if (!force && !ShouldCapture(frame)) return; + if (Count == STATEMASK) + { + indexInvalidated?.Invoke(0); + _firstStateIndex = (_firstStateIndex + 1) & STATEMASK; + } + var start = (_states[HeadStateIndex].Start + _states[HeadStateIndex].Size) & _sizeMask; var initialMaxSize = Count > 0 ? (_states[_firstStateIndex].Start - start) & _sizeMask diff --git a/src/BizHawk.Tests/Client.Common/Movie/ZwinderStateManagerTests.cs b/src/BizHawk.Tests/Client.Common/Movie/ZwinderStateManagerTests.cs index 33849f090b..0333a9e1eb 100644 --- a/src/BizHawk.Tests/Client.Common/Movie/ZwinderStateManagerTests.cs +++ b/src/BizHawk.Tests/Client.Common/Movie/ZwinderStateManagerTests.cs @@ -25,6 +25,27 @@ namespace BizHawk.Tests.Client.Common.Movie Assert.AreEqual(zw.Settings.RecentBufferSize, zw2.Settings.RecentBufferSize); } + [TestMethod] + public void CountEvictWorks() + { + using var zb = new ZwinderBuffer(new RewindConfig + { + BufferSize = 1, + TargetFrameLength = 1 + }); + var ss = new StateSource + { + PaddingData = new byte[10] + }; + var stateCount = 0; + for (int i = 0; i < 1000000; i++) + { + zb.Capture(i, s => ss.SaveStateBinary(new BinaryWriter(s)), j => stateCount--, true); + stateCount++; + } + Assert.AreEqual(zb.Count, stateCount); + } + [TestMethod] public void SaveCreateBufferRoundTrip() {