Debugger: Performance Tracker - Allow controlling display mode/speed with left/right click buttons

This commit is contained in:
Sour 2019-01-24 17:31:29 -05:00
parent 9ceb522874
commit ffc81903f9
4 changed files with 65 additions and 26 deletions

View file

@ -8,6 +8,8 @@ The original scripts can be found on his blog here: http://upsilandre.over-blog.
#include "Console.h"
#include "PPU.h"
#include "DebugHud.h"
#include "IKeyManager.h"
#include "KeyManager.h"
enum Colors
{
@ -40,12 +42,34 @@ PerfTrackerMode PerformanceTracker::GetMode()
return _mode;
}
void PerformanceTracker::ProcessMouseInput()
{
bool leftButtonPressed = KeyManager::IsMouseButtonPressed(MouseButton::LeftButton);
bool rightButtonPressed = KeyManager::IsMouseButtonPressed(MouseButton::RightButton);
if(_leftButtonPressed && leftButtonPressed != _leftButtonPressed) {
//Left button was clicked
_mode = (PerfTrackerMode)((_mode + 1) % 4);
if(_mode == PerfTrackerMode::Disabled) {
_mode = PerfTrackerMode::Fullscreen;
}
}
if(_rightButtonPressed && rightButtonPressed != _rightButtonPressed) {
//Right button was clicked
_updateSpeed = _updateSpeed == PerfTrackerSpeed::Fast ? PerfTrackerSpeed::Normal : PerfTrackerSpeed::Fast;
}
_leftButtonPressed = leftButtonPressed;
_rightButtonPressed = rightButtonPressed;
}
void PerformanceTracker::ProcessEndOfFrame()
{
if(_mode == PerfTrackerMode::Disabled) {
return;
}
ProcessMouseInput();
_data.frameCount++;
_data.frameProcessed = false;
@ -144,8 +168,6 @@ void PerformanceTracker::ProcessCpuExec(AddressTypeInfo & addressInfo)
//Store the current frame's CPU usage as a data point for the chart (each lag frame counts as +100% CPU)
int finalCpu = _data.partialCpu + (lag * 100);
_data.cpuChartDataPoints[_data.cpuChartPos] = finalCpu;
_data.cpuChartPos = (_data.cpuChartPos + 1) % 256;
//Update the average CPU statistic
_data.totalCpu += finalCpu;
@ -161,19 +183,25 @@ void PerformanceTracker::ProcessCpuExec(AddressTypeInfo & addressInfo)
_data.gameFrame++;
//Update the onscreen display for the CPU %
_data.updateCpu = finalCpu;
_data.updateTimer++;
if(_updateSpeed == PerfTrackerSpeed::Fast || _data.updateTimer == 8) {
_data.updateTimer = 0;
_data.cpuChartDataPoints[_data.cpuChartPos] = finalCpu;
_data.cpuChartPos = (_data.cpuChartPos + 1) % 256;
//Calculate the average FPS for the last 20 frames (and add it as a data point for the chart)
_data.fps = 0;
int i = _data.isLagFramePos < 20 ? (60 - (20 - _data.isLagFramePos)) : (_data.isLagFramePos - 20);
do {
_data.fps += _data.isLagFrame[i] ? 0 : 1;
i = (i + 1) % 60;
} while(i != _data.isLagFramePos);
_data.fps *= 3;
//Update the onscreen display for the CPU %
_data.updateCpu = finalCpu;
_data.fpsChartDataPoints[_data.fpsChartPos] = _data.fps;
_data.fpsChartPos = (_data.fpsChartPos + 1) % 256;
//Calculate the average FPS for the last 60 frames (and add it as a data point for the chart)
_data.fps = 0;
int i = _data.isLagFramePos;
do {
_data.fps += _data.isLagFrame[i] ? 0 : 1;
i = (i + 1) % 60;
} while(i != _data.isLagFramePos);
_data.fpsChartDataPoints[_data.fpsChartPos] = _data.fps;
_data.fpsChartPos = (_data.fpsChartPos + 1) % 256;
}
}
}

View file

@ -3,6 +3,7 @@
struct PerfTrackerData
{
int updateTimer = 0;
int frameCount = 0;
int prevFrameCount = 0;
bool frameProcessed = false;
@ -23,6 +24,12 @@ struct PerfTrackerData
int cpuChartDataPoints[256] = {};
};
enum PerfTrackerSpeed
{
Normal = 0,
Fast = 1
};
class PerformanceTracker
{
private:
@ -32,8 +39,12 @@ private:
int32_t _address = -1;
AddressType _type = AddressType::InternalRam;
PerfTrackerMode _mode = PerfTrackerMode::Disabled;
PerfTrackerSpeed _updateSpeed = PerfTrackerSpeed::Normal;
bool _needReset = false;
bool _leftButtonPressed = false;
bool _rightButtonPressed = false;
void ProcessMouseInput();
void DrawChart(int *dataPoints, int startPos, int color, int scale, int maxValue);
public:

View file

@ -498,6 +498,16 @@ namespace Mesen.GUI.Debugger.Controls
} else {
items[nameof(mnuEditSourceFile)].Visible = false;
}
AddressTypeInfo addressInfo = Viewer.GetAddressInfo(Viewer.CodeViewer.SelectedLine);
if(addressInfo.Address >= 0) {
int relAddress = InteropEmu.DebugGetRelativeAddress((uint)addressInfo.Address, addressInfo.Type);
items[nameof(mnuPerfTracker)].Text = "Performance Tracker ($" + relAddress.ToString("X4") + ")";
items[nameof(mnuPerfTracker)].Enabled = true;
} else {
items[nameof(mnuPerfTracker)].Text = "Performance Tracker";
items[nameof(mnuPerfTracker)].Enabled = false;
}
}
private bool UpdateContextMenu(Point mouseLocation)
@ -508,16 +518,6 @@ namespace Mesen.GUI.Debugger.Controls
mnuSwitchView.Text = IsSourceView ? "Switch to Disassembly View" : "Switch to Source View";
AddressTypeInfo addressInfo = Viewer.GetAddressInfo(Viewer.CodeViewer.SelectedLine);
if(addressInfo.Address >= 0) {
int relAddress = InteropEmu.DebugGetRelativeAddress((uint)addressInfo.Address, addressInfo.Type);
mnuPerfTracker.Text = "Performance Tracker ($" + relAddress.ToString("X4") + ")";
mnuPerfTracker.Enabled = true;
} else {
mnuPerfTracker.Text = "Performance Tracker";
mnuPerfTracker.Enabled = false;
}
string word = Viewer.CodeViewer.GetWordUnderLocation(mouseLocation);
Ld65DbgImporter.SymbolInfo symbol = null;
CodeLabel codeLabel = null;

View file

@ -1353,8 +1353,8 @@ namespace Mesen.GUI.Forms
private void ctrlRenderer_DoubleClick(object sender, EventArgs e)
{
if(!CursorManager.NeedMouseIcon && !CursorManager.AllowMouseCapture && !DebugWindowManager.ScriptWindowOpened) {
//Disable double clicking (used to switch to fullscreen mode) when using a mouse-controlled device
if(!CursorManager.NeedMouseIcon && !CursorManager.AllowMouseCapture && !DebugWindowManager.HasOpenedWindow) {
//Disable double clicking (used to switch to fullscreen mode) when using a mouse-controlled device (or when debugger is opened)
ToggleFullscreen();
}
}