diff --git a/BizHawk.Client.EmuHawk/MainForm.cs b/BizHawk.Client.EmuHawk/MainForm.cs index 1a22788b6e..056d55d3ab 100644 --- a/BizHawk.Client.EmuHawk/MainForm.cs +++ b/BizHawk.Client.EmuHawk/MainForm.cs @@ -2551,6 +2551,10 @@ namespace BizHawk.Client.EmuHawk { GlobalWin.Tools.UpdateToolsBefore(); } + else + { + GlobalWin.Tools.FastUpdateBefore(); + } _runloopFps++; @@ -2636,6 +2640,10 @@ namespace BizHawk.Client.EmuHawk { UpdateToolsAfter(); } + else + { + GlobalWin.Tools.FastUpdateAfter(); + } } if (Global.ClientControls["Rewind"] || PressRewind) diff --git a/BizHawk.Client.EmuHawk/config/NES/NESSoundConfig.cs b/BizHawk.Client.EmuHawk/config/NES/NESSoundConfig.cs index d6f41dacbe..c09f8a3d96 100644 --- a/BizHawk.Client.EmuHawk/config/NES/NESSoundConfig.cs +++ b/BizHawk.Client.EmuHawk/config/NES/NESSoundConfig.cs @@ -21,6 +21,11 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + // Do nothing + } + public void Restart() { if (!(Global.Emulator is NES)) diff --git a/BizHawk.Client.EmuHawk/tools/Atari2600/Atari2600Debugger.cs b/BizHawk.Client.EmuHawk/tools/Atari2600/Atari2600Debugger.cs index dae621a9ff..5a47f7cc2d 100644 --- a/BizHawk.Client.EmuHawk/tools/Atari2600/Atari2600Debugger.cs +++ b/BizHawk.Client.EmuHawk/tools/Atari2600/Atari2600Debugger.cs @@ -207,6 +207,11 @@ namespace BizHawk.Client.EmuHawk _programmaticUpdateOfRegisterBoxes = false; } + public void FastUpdate() + { + /* TODO */ + } + private void UpdateTraceLog() { var instructions = Global.CoreComm.Tracer.TakeContents().Split('\n'); diff --git a/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.cs b/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.cs index d509dcb012..d4dac6045c 100644 --- a/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.cs +++ b/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.cs @@ -70,7 +70,12 @@ namespace BizHawk.Client.EmuHawk public void UpdateValues() { - // Do nothing; + // Do nothing + } + + public void FastUpdate() + { + // Do nothing } public void Restart() diff --git a/BizHawk.Client.EmuHawk/tools/GB/GBGPUView.cs b/BizHawk.Client.EmuHawk/tools/GB/GBGPUView.cs index 94d2afd49c..cddd82f188 100644 --- a/BizHawk.Client.EmuHawk/tools/GB/GBGPUView.cs +++ b/BizHawk.Client.EmuHawk/tools/GB/GBGPUView.cs @@ -584,6 +584,11 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + // Do nothing + } + #endregion #region mouseovers diff --git a/BizHawk.Client.EmuHawk/tools/GB/GBGameGenie.cs b/BizHawk.Client.EmuHawk/tools/GB/GBGameGenie.cs index cbdacd29f5..db9c42b242 100644 --- a/BizHawk.Client.EmuHawk/tools/GB/GBGameGenie.cs +++ b/BizHawk.Client.EmuHawk/tools/GB/GBGameGenie.cs @@ -35,6 +35,11 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + // Do nothing + } + public GBGameGenie() { InitializeComponent(); diff --git a/BizHawk.Client.EmuHawk/tools/GBA/GBAGPUView.cs b/BizHawk.Client.EmuHawk/tools/GBA/GBAGPUView.cs index 03b8463f22..67b2f8094c 100644 --- a/BizHawk.Client.EmuHawk/tools/GBA/GBAGPUView.cs +++ b/BizHawk.Client.EmuHawk/tools/GBA/GBAGPUView.cs @@ -718,6 +718,11 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + // Do nothing + } + private void GBAGPUView_Load(object sender, EventArgs e) { Restart(); diff --git a/BizHawk.Client.EmuHawk/tools/Genesis/GenGameGenie.cs b/BizHawk.Client.EmuHawk/tools/Genesis/GenGameGenie.cs index 47adc10131..5c5e5d847f 100644 --- a/BizHawk.Client.EmuHawk/tools/Genesis/GenGameGenie.cs +++ b/BizHawk.Client.EmuHawk/tools/Genesis/GenGameGenie.cs @@ -80,6 +80,11 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + // Do nothing + } + public GenGameGenie() { InitializeComponent(); diff --git a/BizHawk.Client.EmuHawk/tools/Genesis/VDPViewer.cs b/BizHawk.Client.EmuHawk/tools/Genesis/VDPViewer.cs index 16dada284d..5579d081f0 100644 --- a/BizHawk.Client.EmuHawk/tools/Genesis/VDPViewer.cs +++ b/BizHawk.Client.EmuHawk/tools/Genesis/VDPViewer.cs @@ -132,6 +132,11 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + // Do nothing + } + public void Restart() { Emu = Global.Emulator as GPGX; diff --git a/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs b/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs index d1a1bdc875..bb2d0c5499 100644 --- a/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs +++ b/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs @@ -110,6 +110,11 @@ namespace BizHawk.Client.EmuHawk AddressLabel.Text = GenerateAddressString(); } + public void FastUpdate() + { + // Do nothing + } + public void Restart() { if (!IsHandleCreated || IsDisposed) diff --git a/BizHawk.Client.EmuHawk/tools/IToolForm.cs b/BizHawk.Client.EmuHawk/tools/IToolForm.cs index 1182647cb3..04f5490898 100644 --- a/BizHawk.Client.EmuHawk/tools/IToolForm.cs +++ b/BizHawk.Client.EmuHawk/tools/IToolForm.cs @@ -6,7 +6,14 @@ /// Will be called by the client anytime an Update needs to occur, such as after an emulated frame, a loadstate, or a related dialog has made a relevant change /// void UpdateValues(); - + + /// + /// Will be called by the client when performance is critical, + /// The tool should only do the minimum to still function, + /// Drawing should not occur if possible, during a fast update + /// + void FastUpdate(); + /// /// Will be called anytime the dialog needs to be restarted, such as when a new ROM is loaded /// The tool implementing this needs to account for a Game and Core change diff --git a/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs b/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs index 63adf6d838..44ea4d041e 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs @@ -76,7 +76,15 @@ namespace BizHawk.Client.EmuHawk Owner = Global.Config.LuaSettings.FloatingWindow ? null : GlobalWin.MainForm; } - public void UpdateValues() { } + public void UpdateValues() + { + // Do nothing + } + + public void FastUpdate() + { + // Do nothing + } public LuaConsole Get() { return this; } diff --git a/BizHawk.Client.EmuHawk/tools/NES/NESDebugger.cs b/BizHawk.Client.EmuHawk/tools/NES/NESDebugger.cs index f718b75d90..db18a57aab 100644 --- a/BizHawk.Client.EmuHawk/tools/NES/NESDebugger.cs +++ b/BizHawk.Client.EmuHawk/tools/NES/NESDebugger.cs @@ -65,6 +65,11 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + // Do nothing + } + private void UpdateDebugView() { DebugView.BlazingFast = true; diff --git a/BizHawk.Client.EmuHawk/tools/NES/NESGameGenie.cs b/BizHawk.Client.EmuHawk/tools/NES/NESGameGenie.cs index a09b41401d..d50348500e 100644 --- a/BizHawk.Client.EmuHawk/tools/NES/NESGameGenie.cs +++ b/BizHawk.Client.EmuHawk/tools/NES/NESGameGenie.cs @@ -55,6 +55,11 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + // Do nothing + } + public NESGameGenie() { InitializeComponent(); diff --git a/BizHawk.Client.EmuHawk/tools/NES/NESNameTableViewer.cs b/BizHawk.Client.EmuHawk/tools/NES/NESNameTableViewer.cs index 66f34405bc..3ba1e41d6d 100644 --- a/BizHawk.Client.EmuHawk/tools/NES/NESNameTableViewer.cs +++ b/BizHawk.Client.EmuHawk/tools/NES/NESNameTableViewer.cs @@ -70,6 +70,11 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + // Do nothing + } + #endregion private unsafe void DrawTile(int* dst, int pitch, byte* pal, byte* tile, int* finalpal) diff --git a/BizHawk.Client.EmuHawk/tools/NES/NESPPU.cs b/BizHawk.Client.EmuHawk/tools/NES/NESPPU.cs index c99c4504cb..8eefba1ad3 100644 --- a/BizHawk.Client.EmuHawk/tools/NES/NESPPU.cs +++ b/BizHawk.Client.EmuHawk/tools/NES/NESPPU.cs @@ -67,6 +67,11 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + // Do nothing + } + public void Restart() { if (Global.Emulator is NES) diff --git a/BizHawk.Client.EmuHawk/tools/PCE/PCEBGViewer.cs b/BizHawk.Client.EmuHawk/tools/PCE/PCEBGViewer.cs index 41dee3b6e1..3ecb4902dd 100644 --- a/BizHawk.Client.EmuHawk/tools/PCE/PCEBGViewer.cs +++ b/BizHawk.Client.EmuHawk/tools/PCE/PCEBGViewer.cs @@ -125,6 +125,11 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + // Do nothing + } + #endregion #region Events diff --git a/BizHawk.Client.EmuHawk/tools/PCE/PCECDL.cs b/BizHawk.Client.EmuHawk/tools/PCE/PCECDL.cs index fbffa4fbc4..39b9c59fa6 100644 --- a/BizHawk.Client.EmuHawk/tools/PCE/PCECDL.cs +++ b/BizHawk.Client.EmuHawk/tools/PCE/PCECDL.cs @@ -46,6 +46,11 @@ namespace BizHawk.Client.EmuHawk UpdateDisplay(); } + public void FastUpdate() + { + // TODO + } + public void Restart() { if (Global.Emulator is PCEngine) diff --git a/BizHawk.Client.EmuHawk/tools/PCE/PCESoundDebugger.cs b/BizHawk.Client.EmuHawk/tools/PCE/PCESoundDebugger.cs index 24dd2f55fc..e927cf66c4 100644 --- a/BizHawk.Client.EmuHawk/tools/PCE/PCESoundDebugger.cs +++ b/BizHawk.Client.EmuHawk/tools/PCE/PCESoundDebugger.cs @@ -146,6 +146,11 @@ namespace BizHawk.Client.EmuHawk lvChannels.EndUpdate(); } + public void FastUpdate() + { + // Todo + } + class PSGEntry { public int index; diff --git a/BizHawk.Client.EmuHawk/tools/PCE/PCETileViewer.cs b/BizHawk.Client.EmuHawk/tools/PCE/PCETileViewer.cs index 6042eb4eee..80f3ca05d3 100644 --- a/BizHawk.Client.EmuHawk/tools/PCE/PCETileViewer.cs +++ b/BizHawk.Client.EmuHawk/tools/PCE/PCETileViewer.cs @@ -46,6 +46,10 @@ namespace BizHawk.Client.EmuHawk bmpViewSPPal.Refresh(); } + public void FastUpdate() + { + // Do nothing + } unsafe static void Draw16x16(byte* src, int* dest, int pitch, int* pal) { diff --git a/BizHawk.Client.EmuHawk/tools/SMS/VDPViewer.cs b/BizHawk.Client.EmuHawk/tools/SMS/VDPViewer.cs index ae91c9e770..5224d8f5f6 100644 --- a/BizHawk.Client.EmuHawk/tools/SMS/VDPViewer.cs +++ b/BizHawk.Client.EmuHawk/tools/SMS/VDPViewer.cs @@ -150,6 +150,11 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + // Do nothing + } + public void Restart() { if (!(Global.Emulator is SMS)) diff --git a/BizHawk.Client.EmuHawk/tools/SNES/SNESGameGenie.cs b/BizHawk.Client.EmuHawk/tools/SNES/SNESGameGenie.cs index 925efd7f53..b8f3e437ec 100644 --- a/BizHawk.Client.EmuHawk/tools/SNES/SNESGameGenie.cs +++ b/BizHawk.Client.EmuHawk/tools/SNES/SNESGameGenie.cs @@ -77,6 +77,11 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + // Do nothing + } + #endregion private void SnesGGDecode(string code, ref int val, ref int add) diff --git a/BizHawk.Client.EmuHawk/tools/SNES/SNESGraphicsDebugger.cs b/BizHawk.Client.EmuHawk/tools/SNES/SNESGraphicsDebugger.cs index 995bc07172..f78860dbaa 100644 --- a/BizHawk.Client.EmuHawk/tools/SNES/SNESGraphicsDebugger.cs +++ b/BizHawk.Client.EmuHawk/tools/SNES/SNESGraphicsDebugger.cs @@ -145,6 +145,11 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + // To do + } + public void UpdateToolsLoadstate() { SyncCore(); diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IToolForm.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IToolForm.cs index 83addb602a..7a8aebd07d 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IToolForm.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IToolForm.cs @@ -31,6 +31,17 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + // TODO: think more about this + + if (StopFrame.HasValue && Global.Emulator.Frame == StopFrame.Value) + { + GlobalWin.MainForm.PauseEmulator(); + StopFrame = null; + } + } + public void Restart() { if (!IsHandleCreated || IsDisposed) diff --git a/BizHawk.Client.EmuHawk/tools/TI83/TI83KeyPad.cs b/BizHawk.Client.EmuHawk/tools/TI83/TI83KeyPad.cs index 70abf898fc..d9ecb2f47f 100644 --- a/BizHawk.Client.EmuHawk/tools/TI83/TI83KeyPad.cs +++ b/BizHawk.Client.EmuHawk/tools/TI83/TI83KeyPad.cs @@ -45,6 +45,11 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + // Do nothing + } + public void Restart() { if (!(Global.Emulator is TI83)) diff --git a/BizHawk.Client.EmuHawk/tools/ToolBox.cs b/BizHawk.Client.EmuHawk/tools/ToolBox.cs index aea52fb506..08dd18a209 100644 --- a/BizHawk.Client.EmuHawk/tools/ToolBox.cs +++ b/BizHawk.Client.EmuHawk/tools/ToolBox.cs @@ -39,6 +39,11 @@ namespace BizHawk.Client.EmuHawk public bool UpdateBefore { get { return false; } } public void UpdateValues() { } + public void FastUpdate() + { + // Do nothing + } + public void Restart() { SetTools(); diff --git a/BizHawk.Client.EmuHawk/tools/ToolManager.cs b/BizHawk.Client.EmuHawk/tools/ToolManager.cs index ffdbfe738b..ac11bf0548 100644 --- a/BizHawk.Client.EmuHawk/tools/ToolManager.cs +++ b/BizHawk.Client.EmuHawk/tools/ToolManager.cs @@ -252,6 +252,32 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdateBefore() + { + var beforeList = _tools.Where(x => x.UpdateBefore); + foreach (var tool in beforeList) + { + if (!tool.IsDisposed || + (tool is RamWatch && Global.Config.DisplayRamWatch)) // Ram Watch hack, on screen display should run even if Ram Watch is closed + { + tool.FastUpdate(); + } + } + } + + public void FastUpdateAfter() + { + var afterList = _tools.Where(x => !x.UpdateBefore); + foreach (var tool in afterList) + { + if (!tool.IsDisposed || + (tool is RamWatch && Global.Config.DisplayRamWatch)) // Ram Watch hack, on screen display should run even if Ram Watch is closed + { + tool.FastUpdate(); + } + } + } + // Note: Referencing these properties creates an instance of the tool and persists it. They should be referenced by type if this is not desired #region Tools diff --git a/BizHawk.Client.EmuHawk/tools/TraceLogger.cs b/BizHawk.Client.EmuHawk/tools/TraceLogger.cs index 1f8c8da78e..57f24f40c1 100644 --- a/BizHawk.Client.EmuHawk/tools/TraceLogger.cs +++ b/BizHawk.Client.EmuHawk/tools/TraceLogger.cs @@ -90,6 +90,16 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + // TODO: think more about this logic + if (!ToWindowRadio.Checked) + { + LogToFile(); + } + } + + public void Restart() { if (!IsHandleCreated || IsDisposed) diff --git a/BizHawk.Client.EmuHawk/tools/VirtualPads/VirtualpadsTool.cs b/BizHawk.Client.EmuHawk/tools/VirtualPads/VirtualpadsTool.cs index 29aecb03eb..826a85bdf7 100644 --- a/BizHawk.Client.EmuHawk/tools/VirtualPads/VirtualpadsTool.cs +++ b/BizHawk.Client.EmuHawk/tools/VirtualPads/VirtualpadsTool.cs @@ -198,6 +198,16 @@ namespace BizHawk.Client.EmuHawk Pads.ForEach(pad => pad.Refresh()); } + public void FastUpdate() + { + // TODO: SetPrevious logic should go here too or that will get out of whack + + if (!Readonly && !Global.Config.VirtualPadSticky) + { + Pads.ForEach(pad => pad.Clear()); + } + } + #endregion #region Events diff --git a/BizHawk.Client.EmuHawk/tools/Watch/RamSearch.cs b/BizHawk.Client.EmuHawk/tools/Watch/RamSearch.cs index 1358c2b5ea..1dbbb3f512 100644 --- a/BizHawk.Client.EmuHawk/tools/Watch/RamSearch.cs +++ b/BizHawk.Client.EmuHawk/tools/Watch/RamSearch.cs @@ -243,6 +243,19 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + if (_searches.Count > 0) + { + _searches.Update(); + + if (_autoSearch) + { + DoSearch(); + } + } + } + public void Restart() { if (!IsHandleCreated || IsDisposed) diff --git a/BizHawk.Client.EmuHawk/tools/Watch/RamWatch.cs b/BizHawk.Client.EmuHawk/tools/Watch/RamWatch.cs index 4cf663b79a..0497590c35 100644 --- a/BizHawk.Client.EmuHawk/tools/Watch/RamWatch.cs +++ b/BizHawk.Client.EmuHawk/tools/Watch/RamWatch.cs @@ -240,6 +240,40 @@ namespace BizHawk.Client.EmuHawk } } + public void FastUpdate() + { + if (_paused) + { + return; + } + + if ((!IsHandleCreated || IsDisposed) && !Global.Config.DisplayRamWatch) + { + return; + } + + if (_watches.Any()) + { + _watches.UpdateValues(); + + if (Global.Config.DisplayRamWatch) + { + for (var i = 0; i < _watches.Count; i++) + { + var frozen = !_watches[i].IsSeparator && Global.CheatList.IsActive(_watches[i].Domain, _watches[i].Address ?? 0); + GlobalWin.OSD.AddGUIText( + _watches[i].ToString(), + Global.Config.DispRamWatchx, + Global.Config.DispRamWatchy + (i * 14), + Color.Black, + frozen ? Color.Cyan : Color.White, + 0 + ); + } + } + } + } + #endregion #region Private Methods