Rewrite FlushSaveRAM to write the newest sram to disk first, then move older data.

Moved autosave timer sets to save/load sram methods
Manual saves won't reset the autosave timer
Remove excess ticks when lowering the autosave timer
This commit is contained in:
shanehoman 2017-08-18 22:42:28 -07:00
parent 89059673f0
commit bdb197ac23
3 changed files with 38 additions and 43 deletions

View File

@ -453,22 +453,6 @@ namespace BizHawk.Client.EmuHawk
FlushSaveRAM();
}
private void AutoFlushMenuItem_Click(object sender, EventArgs e)
{
switch (((ToolStripMenuItem)sender).Text)
{
case "Off": Global.Config.FlushSaveRamFrames = 0; break;
case "1s": Global.Config.FlushSaveRamFrames = 1 * 60; break;
case "5s": Global.Config.FlushSaveRamFrames = 5 * 60; break;
case "15s": Global.Config.FlushSaveRamFrames = 15 * 60; break;
case "30s": Global.Config.FlushSaveRamFrames = 30 * 60; break;
case "1m": Global.Config.FlushSaveRamFrames = 60 * 60; break;
case "5m": Global.Config.FlushSaveRamFrames = 300 * 60; break;
}
if (_flushSaveRamIn > Global.Config.FlushSaveRamFrames)
_flushSaveRamIn = Global.Config.FlushSaveRamFrames;
}
private void ReadonlyMenuItem_Click(object sender, EventArgs e)
{
ToggleReadOnly();

View File

@ -405,9 +405,7 @@ namespace BizHawk.Client.EmuHawk
{
PauseEmulator();
}
_flushSaveRamIn = Global.Config.FlushSaveRamFrames;
// start dumping, if appropriate
if (argParse.cmdDumpType != null && argParse.cmdDumpName != null)
{
@ -1418,6 +1416,7 @@ namespace BizHawk.Client.EmuHawk
public PresentationPanel PresentationPanel { get; }
private int _flushSaveRamIn;
public int FlushSaveRamIn { get { return _flushSaveRamIn; } set { _flushSaveRamIn = value; } }
#endregion
#region Private methods
@ -1599,6 +1598,7 @@ namespace BizHawk.Client.EmuHawk
}
Emulator.AsSaveRam().StoreSaveRam(sram);
_flushSaveRamIn = Global.Config.FlushSaveRamFrames;
}
catch (IOException)
{
@ -1613,36 +1613,47 @@ namespace BizHawk.Client.EmuHawk
{
var path = PathManager.SaveRamPath(Global.Game);
if (autosave)
path=path.Insert(path.Length-8, ".autosave"); //becomes path\name.autosave.SaveRAM
var f = new FileInfo(path);
if (f.Directory != null && !f.Directory.Exists)
{
f.Directory.Create();
_flushSaveRamIn = Global.Config.FlushSaveRamFrames;
path = path.Insert(path.Length - 8, ".autosave"); //becomes path\name.autosave.SaveRAM
}
var file = new FileInfo(path);
var newPath = path + ".new";
var newFile = new FileInfo(newPath);
var backupPath = path + ".bak";
var backupFile = new FileInfo(backupPath);
if (file.Directory != null && !file.Directory.Exists)
{
file.Directory.Create();
}
// Make backup first
if (Global.Config.BackupSaveram && f.Exists)
{
var backup = path + ".bak";
var backupFile = new FileInfo(backup);
if (backupFile.Exists)
{
backupFile.Delete();
}
f.CopyTo(backup);
}
var writer = new BinaryWriter(new FileStream(path, FileMode.Create, FileAccess.Write));
var writer = new BinaryWriter(new FileStream(newPath, FileMode.Create, FileAccess.Write));
var saveram = Emulator.AsSaveRam().CloneSaveRam();
if (saveram != null)
{
writer.Write(saveram, 0, saveram.Length);
}
_flushSaveRamIn = Global.Config.FlushSaveRamFrames;
writer.Close();
if (file.Exists)
{
if (Global.Config.BackupSaveram)
{
if (backupFile.Exists)
{
backupFile.Delete();
}
file.MoveTo(backupPath);
}
else
{
file.Delete();
}
}
newFile.MoveTo(path);
}
}
@ -2912,13 +2923,11 @@ namespace BizHawk.Client.EmuHawk
Global.MovieSession.HandleMovieOnFrameLoop();
if (Global.Config.AutosaveSaveRAM && Global.Config.FlushSaveRamFrames > 0)
if (Global.Config.AutosaveSaveRAM)
{
_flushSaveRamIn -= 1;
if (_flushSaveRamIn <= 0)
if (FlushSaveRamIn-- <= 0)
{
FlushSaveRAM(true);
_flushSaveRamIn = Global.Config.FlushSaveRamFrames;
}
}
// why not skip audio if the user doesnt want sound

View File

@ -89,6 +89,8 @@ namespace BizHawk.Client.EmuHawk
Global.Config.BackupSaveram = BackupSRamCheckbox.Checked;
Global.Config.AutosaveSaveRAM = AutosaveSRAMCheckbox.Checked;
Global.Config.FlushSaveRamFrames = AutosaveSaveRAMSeconds * 60;
if (GlobalWin.MainForm.FlushSaveRamIn > Global.Config.FlushSaveRamFrames)
GlobalWin.MainForm.FlushSaveRamIn = Global.Config.FlushSaveRamFrames;
Global.Config.SkipLagFrame = FrameAdvSkipLagCheckbox.Checked;
Global.Config.WIN32_CONSOLE = LogWindowAsConsoleCheckbox.Checked;
Global.Config.RunLuaDuringTurbo = LuaDuringTurboCheckbox.Checked;