tasstatemanager: fix out of memory on save
This commit is contained in:
parent
aab2a17947
commit
63b533f15c
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue