mirror of https://github.com/PCSX2/pcsx2.git
recording: Done micro-optimizing GUI
This commit is contained in:
parent
d296f0257f
commit
c89e9134f6
|
@ -200,6 +200,13 @@ void VirtualPad::Render(wxDC &dc)
|
||||||
bdc.DrawBitmap(virtualPadData.background.image, virtualPadData.background.coords, true);
|
bdc.DrawBitmap(virtualPadData.background.image, virtualPadData.background.coords, true);
|
||||||
clearScreenRequired = false;
|
clearScreenRequired = false;
|
||||||
|
|
||||||
|
// NOTE - there is yet another (and I think final) micro-optimization that can be done:
|
||||||
|
// It can be assumed that if the element has already been drawn to the screen (and not cleared) that we can skip rendering it
|
||||||
|
//
|
||||||
|
// For example - you hold a single button for several frames, it will currently draw that every frame
|
||||||
|
// despite the screen never being cleared, this is not strictly necessary.
|
||||||
|
//
|
||||||
|
// After some tests, the performance impact is well within reason, and on the hardware renderer modes, is almost non-existant.
|
||||||
while (!renderQueue.empty()) {
|
while (!renderQueue.empty()) {
|
||||||
VirtualPadElement *element = renderQueue.front();
|
VirtualPadElement *element = renderQueue.front();
|
||||||
element->Render(bdc);
|
element->Render(bdc);
|
||||||
|
|
|
@ -18,6 +18,11 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
|
||||||
|
#include "wx/window.h"
|
||||||
|
#include "wx/frame.h"
|
||||||
|
#include "wx/checkbox.h"
|
||||||
|
#include "Pcsx2Types.h"
|
||||||
|
|
||||||
#include "Recording/PadData.h"
|
#include "Recording/PadData.h"
|
||||||
#include "Recording/VirtualPad/VirtualPadData.h"
|
#include "Recording/VirtualPad/VirtualPadData.h"
|
||||||
|
|
||||||
|
|
|
@ -18,31 +18,44 @@
|
||||||
#include <wx/spinctrl.h>
|
#include <wx/spinctrl.h>
|
||||||
|
|
||||||
#include "Recording/VirtualPad/VirtualPadResources.h"
|
#include "Recording/VirtualPad/VirtualPadResources.h"
|
||||||
|
#include "Recording/PadData.h"
|
||||||
|
|
||||||
void ControllerNormalButton::UpdateGuiElement(std::queue<VirtualPadElement*> *renderQueue, bool &clearScreenRequired)
|
void ControllerNormalButton::UpdateGuiElement(std::queue<VirtualPadElement*> *renderQueue, bool &clearScreenRequired)
|
||||||
{
|
{
|
||||||
ControllerNormalButton &button = *this;
|
ControllerNormalButton &button = *this;
|
||||||
if (button.renderRequired)
|
if (button.widgetUpdateRequired)
|
||||||
{
|
{
|
||||||
button.pressedBox->SetValue(button.pressed);
|
button.pressedBox->SetValue(button.pressed);
|
||||||
clearScreenRequired = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (button.pressed)
|
if (button.pressed)
|
||||||
{
|
{
|
||||||
renderQueue->push(this);
|
renderQueue->push(this);
|
||||||
|
}
|
||||||
|
else if (button.currentlyRendered)
|
||||||
|
{
|
||||||
|
button.currentlyRendered = false;
|
||||||
|
clearScreenRequired = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControllerPressureButton::UpdateGuiElement(std::queue<VirtualPadElement *> *renderQueue, bool &clearScreenRequired)
|
void ControllerPressureButton::UpdateGuiElement(std::queue<VirtualPadElement *> *renderQueue, bool &clearScreenRequired)
|
||||||
{
|
{
|
||||||
ControllerPressureButton &button = *this;
|
ControllerPressureButton &button = *this;
|
||||||
if (button.renderRequired)
|
if (button.widgetUpdateRequired)
|
||||||
{
|
{
|
||||||
button.pressureSpinner->SetValue(button.pressure);
|
button.pressureSpinner->SetValue(button.pressure);
|
||||||
clearScreenRequired = true;
|
clearScreenRequired = true;
|
||||||
}
|
}
|
||||||
if (button.pressed) {
|
|
||||||
|
if (button.pressed)
|
||||||
|
{
|
||||||
renderQueue->push(this);
|
renderQueue->push(this);
|
||||||
|
}
|
||||||
|
else if (button.currentlyRendered)
|
||||||
|
{
|
||||||
|
button.currentlyRendered = false;
|
||||||
|
clearScreenRequired = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,23 +64,24 @@ void AnalogStick::UpdateGuiElement(std::queue<VirtualPadElement *> *renderQueue,
|
||||||
AnalogStick &analogStick = *this;
|
AnalogStick &analogStick = *this;
|
||||||
// Update the GUI elements that need updating
|
// Update the GUI elements that need updating
|
||||||
// If either vector has changed, we need to redraw the graphics
|
// If either vector has changed, we need to redraw the graphics
|
||||||
if (analogStick.xVector.renderRequired)
|
if (analogStick.xVector.widgetUpdateRequired)
|
||||||
{
|
{
|
||||||
analogStick.xVector.slider->SetValue(analogStick.xVector.val);
|
analogStick.xVector.slider->SetValue(analogStick.xVector.val);
|
||||||
analogStick.xVector.spinner->SetValue(analogStick.xVector.val);
|
analogStick.xVector.spinner->SetValue(analogStick.xVector.val);
|
||||||
clearScreenRequired = true;
|
|
||||||
}
|
}
|
||||||
if (analogStick.yVector.renderRequired)
|
if (analogStick.yVector.widgetUpdateRequired)
|
||||||
{
|
{
|
||||||
analogStick.yVector.slider->SetValue(analogStick.yVector.val);
|
analogStick.yVector.slider->SetValue(analogStick.yVector.val);
|
||||||
analogStick.yVector.spinner->SetValue(analogStick.yVector.val);
|
analogStick.yVector.spinner->SetValue(analogStick.yVector.val);
|
||||||
clearScreenRequired = true;
|
|
||||||
}
|
}
|
||||||
// TODO constant for neutral position
|
if (!(analogStick.xVector.val == PadData::ANALOG_VECTOR_NEUTRAL && analogStick.yVector.val == PadData::ANALOG_VECTOR_NEUTRAL))
|
||||||
if (!(analogStick.xVector.val == 127 && analogStick.yVector.val == 127))
|
|
||||||
{
|
{
|
||||||
renderQueue->push(this);
|
renderQueue->push(this);
|
||||||
}
|
}
|
||||||
|
else if (analogStick.currentlyRendered) {
|
||||||
|
analogStick.currentlyRendered = false;
|
||||||
|
clearScreenRequired = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControllerNormalButton::Render(wxDC &dc)
|
void ControllerNormalButton::Render(wxDC &dc)
|
||||||
|
@ -75,6 +89,7 @@ void ControllerNormalButton::Render(wxDC &dc)
|
||||||
ControllerNormalButton &button = *this;
|
ControllerNormalButton &button = *this;
|
||||||
ImageFile &img = button.icon;
|
ImageFile &img = button.icon;
|
||||||
dc.DrawBitmap(img.image, img.coords, true);
|
dc.DrawBitmap(img.image, img.coords, true);
|
||||||
|
button.currentlyRendered = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControllerPressureButton::Render(wxDC &dc)
|
void ControllerPressureButton::Render(wxDC &dc)
|
||||||
|
@ -82,6 +97,7 @@ void ControllerPressureButton::Render(wxDC &dc)
|
||||||
ControllerPressureButton &button = *this;
|
ControllerPressureButton &button = *this;
|
||||||
ImageFile &img = button.icon;
|
ImageFile &img = button.icon;
|
||||||
dc.DrawBitmap(img.image, img.coords, true);
|
dc.DrawBitmap(img.image, img.coords, true);
|
||||||
|
button.currentlyRendered = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnalogStick::Render(wxDC &dc)
|
void AnalogStick::Render(wxDC &dc)
|
||||||
|
@ -105,6 +121,7 @@ void AnalogStick::Render(wxDC &dc)
|
||||||
dc.DrawLine(analogPos.centerCoords, analogPos.endCoords);
|
dc.DrawLine(analogPos.centerCoords, analogPos.endCoords);
|
||||||
dc.DrawCircle(analogPos.endCoords, wxCoord(analogPos.lineThickness));
|
dc.DrawCircle(analogPos.endCoords, wxCoord(analogPos.lineThickness));
|
||||||
dc.SetPen(wxNullPen);
|
dc.SetPen(wxNullPen);
|
||||||
|
analogStick.currentlyRendered = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO - duplicate code between this and the pressure button, inheritance should be able to remove it
|
// TODO - duplicate code between this and the pressure button, inheritance should be able to remove it
|
||||||
|
|
|
@ -33,7 +33,7 @@ struct AnalogVector
|
||||||
|
|
||||||
u8 val = 127;
|
u8 val = 127;
|
||||||
|
|
||||||
bool renderRequired = false;
|
bool widgetUpdateRequired = false;
|
||||||
bool isControllerBypassed = false;
|
bool isControllerBypassed = false;
|
||||||
u8 prevVal = 127;
|
u8 prevVal = 127;
|
||||||
|
|
||||||
|
@ -53,6 +53,8 @@ struct AnalogPosition
|
||||||
class VirtualPadElement
|
class VirtualPadElement
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
bool currentlyRendered = false;
|
||||||
|
|
||||||
virtual void UpdateGuiElement(std::queue<VirtualPadElement *> *renderQueue, bool &clearScreenRequired) = 0;
|
virtual void UpdateGuiElement(std::queue<VirtualPadElement *> *renderQueue, bool &clearScreenRequired) = 0;
|
||||||
virtual void Render(wxDC &dc) = 0;
|
virtual void Render(wxDC &dc) = 0;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue