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 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)
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue