tasstatemanager: fix out of memory on save

This commit is contained in:
goyuken 2014-08-24 21:53:48 +00:00
parent aab2a17947
commit 63b533f15c
2 changed files with 22 additions and 35 deletions

View File

@ -32,7 +32,7 @@ namespace BizHawk.Client.Common
bs.PutLump(BinaryStateLump.GreenzoneSettings, tw => tw.WriteLine(StateManager.Settings.ToString()));
if (StateManager.Settings.SaveGreenzone)
{
bs.PutLump(BinaryStateLump.Greenzone, (BinaryWriter bw) => bw.Write(StateManager.ToArray()));
bs.PutLump(BinaryStateLump.Greenzone, (BinaryWriter bw) => StateManager.Save(bw));
}
bs.PutLump(BinaryStateLump.LagLog, (BinaryWriter bw) => bw.Write(LagLog.ToByteArray()));
@ -159,7 +159,7 @@ namespace BizHawk.Client.Common
{
bl.GetLump(BinaryStateLump.Greenzone, false, delegate(BinaryReader br, long length)
{
StateManager.FromArray(br.ReadBytes((int)length));
StateManager.Load(br);
});
}

View File

@ -103,51 +103,38 @@ namespace BizHawk.Client.Common
Used = 0;
}
public byte[] ToArray()
public void Save(BinaryWriter bw)
{
MemoryStream ms = new MemoryStream();
var bytes = BitConverter.GetBytes(States.Count);
ms.Write(bytes, 0, bytes.Length);
bw.Write(States.Count);
foreach (var kvp in States)
{
var frame = BitConverter.GetBytes(kvp.Key);
ms.Write(frame, 0, frame.Length);
var stateLen = BitConverter.GetBytes(kvp.Value.Length);
ms.Write(stateLen, 0, stateLen.Length);
ms.Write(kvp.Value, 0, kvp.Value.Length);
bw.Write(kvp.Key);
bw.Write(kvp.Value.Length);
bw.Write(kvp.Value);
}
return ms.ToArray();
}
public void Load(BinaryReader br)
{
// ARE WE SUPPOSED TO CLEAR FIRST???
int nstates = br.ReadInt32();
for (int i = 0; i < nstates; i++)
{
int frame = br.ReadInt32();
int len = br.ReadInt32();
byte[] data = br.ReadBytes(len);
States.Add(frame, data);
Used += len;
}
}
// Map:
// 4 bytes - total savestate count
//[Foreach state]
// 4 bytes - frame
// 4 bytes - length of savestate
// 0 - n savestate
public void FromArray(byte[] bytes)
{
var position = 0;
var stateCount = BitConverter.ToInt32(bytes, 0);
position += 4;
for (int i = 0; i < stateCount; i++)
{
var frame = BitConverter.ToInt32(bytes, position);
position += 4;
var stateLen = BitConverter.ToInt32(bytes, position);
position += 4;
var state = bytes
.Skip(position)
.Take(stateLen)
.ToArray();
position += stateLen;
States.Add(frame, state);
Used += state.Length;
}
}
private int Used
{