speed up apple2 savestates, round 1
This commit is contained in:
parent
44027bc6de
commit
fcb5af62d6
|
@ -3,62 +3,90 @@ using System.IO;
|
||||||
using System;
|
using System;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
|
using Jellyfish.Virtu;
|
||||||
|
|
||||||
namespace BizHawk.Emulation.Cores.Computers.AppleII
|
namespace BizHawk.Emulation.Cores.Computers.AppleII
|
||||||
{
|
{
|
||||||
public partial class AppleII : IStatable
|
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; } }
|
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
|
private class OtherData
|
||||||
{
|
{
|
||||||
public int Frame;
|
public int Frame;
|
||||||
public int LagCount;
|
public int LagCount;
|
||||||
public bool IsLagFrame;
|
public bool IsLagFrame;
|
||||||
public int CurrentDisk;
|
public int CurrentDisk;
|
||||||
public JObject Core;
|
public Machine Core;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void InitSaveStates()
|
||||||
|
{
|
||||||
|
ser.Converters.Add(new CoreConverter());
|
||||||
|
}
|
||||||
|
|
||||||
private JsonSerializer ser = new JsonSerializer();
|
private JsonSerializer ser = new JsonSerializer();
|
||||||
|
|
||||||
[FeatureNotImplemented]
|
|
||||||
public void SaveStateText(TextWriter writer)
|
public void SaveStateText(TextWriter writer)
|
||||||
{
|
{
|
||||||
var w = new JTokenWriter();
|
SerializeEverything(new JsonTextWriter(writer) { Formatting = Formatting.None });
|
||||||
_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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LoadStateText(TextReader reader)
|
public void LoadStateText(TextReader reader)
|
||||||
{
|
{
|
||||||
var o = (OtherData)ser.Deserialize(reader, typeof(OtherData));
|
DeserializeEverything(new JsonTextReader(reader));
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SaveStateBinary(BinaryWriter writer)
|
public void SaveStateBinary(BinaryWriter writer)
|
||||||
|
|
|
@ -48,6 +48,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
||||||
//for junk.dsk the .dsk is important because it determines the format from that
|
//for junk.dsk the .dsk is important because it determines the format from that
|
||||||
InitDisk();
|
InitDisk();
|
||||||
|
|
||||||
|
InitSaveStates();
|
||||||
SetupMemoryDomains();
|
SetupMemoryDomains();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue