From a355f78631aa4690d0b57aaff06bcfaa6ae4360a Mon Sep 17 00:00:00 2001 From: zeromus Date: Sun, 10 Jan 2016 23:08:13 -0600 Subject: [PATCH] don't load entire inputlog into a string when parking it in a savestate --- BizHawk.Client.Common/movie/MovieSession.cs | 2 +- .../movie/bk2/Bk2Movie.IO.cs | 2 +- .../movie/bk2/Bk2Movie.InputLog.cs | 26 ++++++++++--------- .../movie/bkm/BkmMovie.InputLog.cs | 15 +++++++---- .../movie/interfaces/IMovie.cs | 5 ++++ .../movie/tasproj/TasMovie.IO.cs | 2 +- 6 files changed, 32 insertions(+), 20 deletions(-) diff --git a/BizHawk.Client.Common/movie/MovieSession.cs b/BizHawk.Client.Common/movie/MovieSession.cs index 5b59362755..31a76adcc2 100644 --- a/BizHawk.Client.Common/movie/MovieSession.cs +++ b/BizHawk.Client.Common/movie/MovieSession.cs @@ -219,7 +219,7 @@ namespace BizHawk.Client.Common { if (Movie.IsActive) { - writer.Write(Movie.GetInputLog()); + Movie.WriteInputLog(writer); } } diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs index 396f6239f8..e9e0b1bc83 100644 --- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs +++ b/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs @@ -183,7 +183,7 @@ namespace BizHawk.Client.Common bs.PutLump(BinaryStateLump.Subtitles, tw => tw.WriteLine(Subtitles.ToString())); bs.PutLump(BinaryStateLump.SyncSettings, tw => tw.WriteLine(_syncSettingsJson)); - bs.PutLump(BinaryStateLump.Input, tw => tw.WriteLine(RawInputLog())); + bs.PutLump(BinaryStateLump.Input, tw => WriteInputLog(tw)); if (StartsFromSavestate) { diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs index a7e591b2e8..efd991227d 100644 --- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs +++ b/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs @@ -14,14 +14,19 @@ namespace BizHawk.Client.Common public string GetInputLog() { var sb = new StringBuilder(); - - sb.AppendLine("[Input]"); - sb.Append(RawInputLog()); - sb.AppendLine("[/Input]"); - + var writer = new StringWriter(sb); + WriteInputLog(writer); + writer.Flush(); return sb.ToString(); } + public void WriteInputLog(TextWriter writer) + { + writer.WriteLine("[Input]"); + WriteRawInputLog(writer); + writer.WriteLine("[/Input]"); + } + public string GetInputLogEntry(int frame) { if (frame < FrameCount && frame >= 0) @@ -294,20 +299,17 @@ namespace BizHawk.Client.Common return true; } - protected StringBuilder RawInputLog() + protected void WriteRawInputLog(TextWriter writer) { var lg = new Bk2LogEntryGenerator(LogKey); lg.SetSource(Global.MovieOutputHardpoint); - var sb = new StringBuilder(); - sb.AppendLine(lg.GenerateLogKey()); - sb.EnsureCapacity(sb.Capacity + _log.Count); + writer.WriteLine(lg.GenerateLogKey()); + foreach (var record in _log) { - sb.AppendLine(record); + writer.WriteLine(record); } - - return sb; } /// diff --git a/BizHawk.Client.Common/movie/bkm/BkmMovie.InputLog.cs b/BizHawk.Client.Common/movie/bkm/BkmMovie.InputLog.cs index a508936aca..5926206ce2 100644 --- a/BizHawk.Client.Common/movie/bkm/BkmMovie.InputLog.cs +++ b/BizHawk.Client.Common/movie/bkm/BkmMovie.InputLog.cs @@ -13,17 +13,22 @@ namespace BizHawk.Client.Common public string GetInputLog() { var sb = new StringBuilder(); + var writer = new StringWriter(sb); + WriteInputLog(writer); + writer.Flush(); + return sb.ToString(); + } - sb.AppendLine("[Input]"); + public void WriteInputLog(TextWriter writer) + { + writer.WriteLine("[Input]"); foreach (var record in _log) { - sb.AppendLine(record); + writer.WriteLine(record); } - sb.AppendLine("[/Input]"); - - return sb.ToString(); + writer.WriteLine("[/Input]"); } public string GetInputLogEntry(int frame) diff --git a/BizHawk.Client.Common/movie/interfaces/IMovie.cs b/BizHawk.Client.Common/movie/interfaces/IMovie.cs index d6edda3e0a..4da742a75a 100644 --- a/BizHawk.Client.Common/movie/interfaces/IMovie.cs +++ b/BizHawk.Client.Common/movie/interfaces/IMovie.cs @@ -114,6 +114,11 @@ namespace BizHawk.Client.Common /// returns a string represntation of the input log in its current state string GetInputLog(); + /// + /// Writes the input log directly to the stream, bypassing the need to load it all into ram as a string + /// + void WriteInputLog(TextWriter writer); + /// /// Gets one frame from the input log. /// diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs b/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs index ddf0861d33..ae9ae95442 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs @@ -31,7 +31,7 @@ namespace BizHawk.Client.Common bs.PutLump(BinaryStateLump.Comments, tw => tw.WriteLine(CommentsString())); bs.PutLump(BinaryStateLump.Subtitles, tw => tw.WriteLine(Subtitles.ToString())); bs.PutLump(BinaryStateLump.SyncSettings, tw => tw.WriteLine(SyncSettingsJson)); - bs.PutLump(BinaryStateLump.Input, tw => tw.WriteLine(RawInputLog())); + bs.PutLump(BinaryStateLump.Input, tw => WriteInputLog(tw)); // TasProj extras bs.PutLump(BinaryStateLump.StateHistorySettings, tw => tw.WriteLine(StateManager.Settings.ToString()));