speed up apple2 savestates, round 1

This commit is contained in:
goyuken 2015-05-18 01:30:30 +00:00
parent 44027bc6de
commit fcb5af62d6
2 changed files with 63 additions and 34 deletions

View File

@ -3,62 +3,90 @@ using System.IO;
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Jellyfish.Virtu;
namespace BizHawk.Emulation.Cores.Computers.AppleII
{
public partial class AppleII : IStatable
{
private class CoreConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Machine);
}
public override bool CanRead { get { return true; } }
public override bool CanWrite { get { return false; } }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// uses its own serialization context: intentional
return Machine.Deserialize(reader);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
public bool BinarySaveStatesPreferred { get { return false; } }
private void SerializeEverything(JsonWriter w)
{
// this is much faster than other possibilities for serialization
w.WriteStartObject();
w.WritePropertyName("Frame");
w.WriteValue(Frame);
w.WritePropertyName("LagCount");
w.WriteValue(LagCount);
w.WritePropertyName("IsLagFrame");
w.WriteValue(IsLagFrame);
w.WritePropertyName("CurrentDisk");
w.WriteValue(CurrentDisk);
w.WritePropertyName("Core");
_machine.Serialize(w);
w.WriteEndObject();
}
private void DeserializeEverything(JsonReader r)
{
var o = (OtherData)ser.Deserialize(r, typeof(OtherData));
Frame = o.Frame;
LagCount = o.LagCount;
IsLagFrame = o.IsLagFrame;
CurrentDisk = o.CurrentDisk;
_machine = o.Core;
// should not be needed.
// InitDisk();
}
private class OtherData
{
public int Frame;
public int LagCount;
public bool IsLagFrame;
public int CurrentDisk;
public JObject Core;
public Machine Core;
}
private void InitSaveStates()
{
ser.Converters.Add(new CoreConverter());
}
private JsonSerializer ser = new JsonSerializer();
[FeatureNotImplemented]
public void SaveStateText(TextWriter writer)
{
var w = new JTokenWriter();
_machine.Serialize(w);
var o = new OtherData
{
Frame = Frame,
LagCount = LagCount,
IsLagFrame = IsLagFrame,
CurrentDisk = CurrentDisk,
Core = (JObject)w.Token,
};
var jw = new JsonTextWriter(writer) { Formatting = Newtonsoft.Json.Formatting.Indented };
ser.Serialize(jw, o);
SerializeEverything(new JsonTextWriter(writer) { Formatting = Formatting.None });
}
public void LoadStateText(TextReader reader)
{
var o = (OtherData)ser.Deserialize(reader, typeof(OtherData));
Frame = o.Frame;
LagCount = o.LagCount;
IsLagFrame = o.IsLagFrame;
CurrentDisk = o.CurrentDisk;
var r = new JTokenReader(o.Core);
try
{
_machine = Jellyfish.Virtu.Machine.Deserialize(r);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
throw;
}
// should not be needed.
// InitDisk();
DeserializeEverything(new JsonTextReader(reader));
}
public void SaveStateBinary(BinaryWriter writer)

View File

@ -48,6 +48,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
//for junk.dsk the .dsk is important because it determines the format from that
InitDisk();
InitSaveStates();
SetupMemoryDomains();
}