From 000050b1e98c34723568bda97a81711f0939ea1e Mon Sep 17 00:00:00 2001 From: feos Date: Mon, 25 Apr 2016 18:04:14 +0300 Subject: [PATCH] tastudio: integrate StateGap logic into ExcludeStates(). for loaded projects, stop forcing current frame capture if it's non-zero. stop excluding state on frame 0. todo: make capture state gap reliable for project state gap. right now it can capture odd frames if they go after markers or lag, so those will be missing when saving the project. --- .../movie/tasproj/TasMovie.IO.cs | 2 +- .../movie/tasproj/TasStateManager.cs | 37 +++++++++++++++---- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs b/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs index ae9ae95442..8338415819 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs @@ -211,7 +211,7 @@ namespace BizHawk.Client.Common } // Movie should always have a state at frame 0. - if (!this.StartsFromSavestate) + if (!this.StartsFromSavestate && Global.Emulator.Frame == 0) StateManager.Capture(); } diff --git a/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs b/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs index 1030660945..c3acbfbd49 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs @@ -81,6 +81,11 @@ namespace BizHawk.Client.Common get { return (int)(Settings.Cap / _expectedStateSize) + (int)((ulong)Settings.DiskCapacitymb * 1024 * 1024 / _expectedStateSize); } } + private int _stateGap + { + get { return 1 << Settings.StateGap; } + } + public TasStateManager(TasMovie movie) { _movie = movie; @@ -520,9 +525,27 @@ namespace BizHawk.Client.Common private List ExcludeStates() { List ret = new List(); - ulong saveUsed = Used + DiskUsed; - int index = -1; + + // respect state gap no matter how small the resulting size will be + // still leave marker states + for (int i = 1; i < States.Count; i++) + { + if (_movie.Markers.IsMarker(States.ElementAt(i).Key + 1) || + States.ElementAt(i).Key % _stateGap == 0) + continue; + + ret.Add(i); + + if (States.ElementAt(i).Value.IsOnDisk) + saveUsed -= _expectedStateSize; + else + saveUsed -= (ulong)States.ElementAt(i).Value.Length; + } + + // if the size is still too big, exclude states form the beginning + // still leave marker states + int index = 0; while (saveUsed > (ulong)Settings.DiskSaveCapacitymb * 1024 * 1024) { do @@ -544,8 +567,8 @@ namespace BizHawk.Client.Common saveUsed -= (ulong)States.ElementAt(index).Value.Length; } - // If there are enough markers to still be over the limit, remove marker frames - index = -1; + // if there are enough markers to still be over the limit, remove marker frames + index = 0; while (saveUsed > (ulong)Settings.DiskSaveCapacitymb * 1024 * 1024) { index++; @@ -563,13 +586,11 @@ namespace BizHawk.Client.Common public void Save(BinaryWriter bw) { List noSave = ExcludeStates(); - int stateGap = 1 << Settings.StateGap; - bw.Write(States.Count / stateGap - noSave.Count); + bw.Write(States.Count - noSave.Count); for (int i = 0; i < States.Count; i++) { - if (noSave.Contains(i) || - States.ElementAt(i).Key % stateGap != 0) + if (noSave.Contains(i)) continue; StateAccessed(States.ElementAt(i).Key);