mirror of https://github.com/stella-emu/stella.git
further minimized UI redraws when message is displayed
This commit is contained in:
parent
e93e4b8fdb
commit
3063752f60
|
@ -322,10 +322,11 @@ void FrameBuffer::update(bool force)
|
||||||
// - at the bottom of ::update(), to actually draw them (this must come
|
// - at the bottom of ::update(), to actually draw them (this must come
|
||||||
// last, since they are always drawn on top of everything else).
|
// last, since they are always drawn on top of everything else).
|
||||||
|
|
||||||
// Forced full rendering is required when messages are being disabled
|
// Forced rendering without drawing is required when messages are being disabled
|
||||||
force |= (myMsg.enabled && myMsg.counter == 0);
|
// Only relevant for LAUNCHER, PAUSE and DEBUGGER modes
|
||||||
|
bool rerender = force || (myMsg.enabled && myMsg.counter == 0);
|
||||||
|
|
||||||
bool redraw = false;
|
bool redraw = force;
|
||||||
switch(myOSystem.eventHandler().state())
|
switch(myOSystem.eventHandler().state())
|
||||||
{
|
{
|
||||||
case EventHandlerState::NONE:
|
case EventHandlerState::NONE:
|
||||||
|
@ -341,7 +342,7 @@ void FrameBuffer::update(bool force)
|
||||||
myPausedCount = uInt32(7 * myOSystem.frameRate());
|
myPausedCount = uInt32(7 * myOSystem.frameRate());
|
||||||
showTextMessage("Paused", MessagePosition::MiddleCenter);
|
showTextMessage("Paused", MessagePosition::MiddleCenter);
|
||||||
}
|
}
|
||||||
if(force)
|
if(rerender)
|
||||||
myTIASurface->render();
|
myTIASurface->render();
|
||||||
|
|
||||||
break; // EventHandlerState::PAUSE
|
break; // EventHandlerState::PAUSE
|
||||||
|
@ -350,8 +351,8 @@ void FrameBuffer::update(bool force)
|
||||||
#ifdef GUI_SUPPORT
|
#ifdef GUI_SUPPORT
|
||||||
case EventHandlerState::OPTIONSMENU:
|
case EventHandlerState::OPTIONSMENU:
|
||||||
{
|
{
|
||||||
redraw = myOSystem.menu().needsRedraw();
|
redraw |= myOSystem.menu().needsRedraw();
|
||||||
if(force || redraw)
|
if(redraw)
|
||||||
{
|
{
|
||||||
clear();
|
clear();
|
||||||
myTIASurface->render();
|
myTIASurface->render();
|
||||||
|
@ -362,8 +363,8 @@ void FrameBuffer::update(bool force)
|
||||||
|
|
||||||
case EventHandlerState::CMDMENU:
|
case EventHandlerState::CMDMENU:
|
||||||
{
|
{
|
||||||
redraw = myOSystem.commandMenu().needsRedraw();
|
redraw |= myOSystem.commandMenu().needsRedraw();
|
||||||
if(force || redraw)
|
if(redraw)
|
||||||
{
|
{
|
||||||
clear();
|
clear();
|
||||||
myTIASurface->render();
|
myTIASurface->render();
|
||||||
|
@ -374,8 +375,8 @@ void FrameBuffer::update(bool force)
|
||||||
|
|
||||||
case EventHandlerState::MESSAGEMENU:
|
case EventHandlerState::MESSAGEMENU:
|
||||||
{
|
{
|
||||||
redraw = myOSystem.messageMenu().needsRedraw();
|
redraw |= myOSystem.messageMenu().needsRedraw();
|
||||||
if(force || redraw)
|
if(redraw)
|
||||||
{
|
{
|
||||||
clear();
|
clear();
|
||||||
myTIASurface->render();
|
myTIASurface->render();
|
||||||
|
@ -386,8 +387,8 @@ void FrameBuffer::update(bool force)
|
||||||
|
|
||||||
case EventHandlerState::TIMEMACHINE:
|
case EventHandlerState::TIMEMACHINE:
|
||||||
{
|
{
|
||||||
redraw = myOSystem.timeMachine().needsRedraw();
|
redraw |= myOSystem.timeMachine().needsRedraw();
|
||||||
if(force || redraw)
|
if(redraw)
|
||||||
{
|
{
|
||||||
clear();
|
clear();
|
||||||
myTIASurface->render();
|
myTIASurface->render();
|
||||||
|
@ -416,8 +417,8 @@ void FrameBuffer::update(bool force)
|
||||||
r.rewindStates(1);
|
r.rewindStates(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
force = force || success;
|
redraw |= success;
|
||||||
if(force)
|
if(redraw)
|
||||||
myTIASurface->render();
|
myTIASurface->render();
|
||||||
|
|
||||||
// Stop playback mode at the end of the state buffer
|
// Stop playback mode at the end of the state buffer
|
||||||
|
@ -432,11 +433,11 @@ void FrameBuffer::update(bool force)
|
||||||
|
|
||||||
case EventHandlerState::LAUNCHER:
|
case EventHandlerState::LAUNCHER:
|
||||||
{
|
{
|
||||||
redraw = myOSystem.launcher().needsRedraw();
|
redraw |= myOSystem.launcher().needsRedraw();
|
||||||
if(force || redraw)
|
if(redraw)
|
||||||
{
|
|
||||||
myOSystem.launcher().draw(force);
|
myOSystem.launcher().draw(force);
|
||||||
}
|
else if(rerender)
|
||||||
|
myOSystem.launcher().render();
|
||||||
break; // EventHandlerState::LAUNCHER
|
break; // EventHandlerState::LAUNCHER
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -444,12 +445,11 @@ void FrameBuffer::update(bool force)
|
||||||
#ifdef DEBUGGER_SUPPORT
|
#ifdef DEBUGGER_SUPPORT
|
||||||
case EventHandlerState::DEBUGGER:
|
case EventHandlerState::DEBUGGER:
|
||||||
{
|
{
|
||||||
redraw = myOSystem.debugger().needsRedraw();
|
redraw |= myOSystem.debugger().needsRedraw();
|
||||||
if(force || redraw)
|
if(redraw)
|
||||||
{
|
|
||||||
|
|
||||||
myOSystem.debugger().draw(force);
|
myOSystem.debugger().draw(force);
|
||||||
}
|
else if(rerender)
|
||||||
|
myOSystem.debugger().render();
|
||||||
break; // EventHandlerState::DEBUGGER
|
break; // EventHandlerState::DEBUGGER
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -466,7 +466,7 @@ void FrameBuffer::update(bool force)
|
||||||
redraw |= drawMessage();
|
redraw |= drawMessage();
|
||||||
|
|
||||||
// Push buffers to screen only when necessary
|
// Push buffers to screen only when necessary
|
||||||
if(force || redraw)
|
if(redraw || rerender)
|
||||||
myBackend->renderToScreen();
|
myBackend->renderToScreen();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -518,7 +518,6 @@ void FrameBuffer::createMessage(const string& message, MessagePosition position,
|
||||||
myMsg.enabled = true;
|
myMsg.enabled = true;
|
||||||
myMsg.dirty = true;
|
myMsg.dirty = true;
|
||||||
|
|
||||||
|
|
||||||
myMsg.surface->setSrcSize(myMsg.w, myMsg.h);
|
myMsg.surface->setSrcSize(myMsg.w, myMsg.h);
|
||||||
myMsg.surface->setDstSize(myMsg.w * hidpiScaleFactor(), myMsg.h * hidpiScaleFactor());
|
myMsg.surface->setDstSize(myMsg.w * hidpiScaleFactor(), myMsg.h * hidpiScaleFactor());
|
||||||
}
|
}
|
||||||
|
@ -666,7 +665,7 @@ void FrameBuffer::enableMessages(bool enable)
|
||||||
|
|
||||||
// Erase old messages on the screen
|
// Erase old messages on the screen
|
||||||
myMsg.counter = 0;
|
myMsg.counter = 0;
|
||||||
update(true); // Force update immediately
|
update(); // update immediately
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -892,7 +891,7 @@ void FrameBuffer::stateChanged(EventHandlerState state)
|
||||||
// Make sure any onscreen messages are removed
|
// Make sure any onscreen messages are removed
|
||||||
myMsg.counter = 0;
|
myMsg.counter = 0;
|
||||||
|
|
||||||
update(true); // force full update
|
update(); // update immediately
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
|
@ -91,21 +91,36 @@ void DialogContainer::updateTime(uInt64 time)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void DialogContainer::draw(bool full)
|
void DialogContainer::draw(bool full)
|
||||||
{
|
{
|
||||||
cerr << "draw " << full << " " << typeid(*this).name() << endl;
|
|
||||||
if(myDialogStack.empty())
|
if(myDialogStack.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
cerr << "draw " << full << " " << typeid(*this).name() << endl;
|
||||||
|
|
||||||
// Make the top dialog dirty if a full redraw is requested
|
// Make the top dialog dirty if a full redraw is requested
|
||||||
if(full)
|
if(full)
|
||||||
myDialogStack.top()->setDirty();
|
myDialogStack.top()->setDirty();
|
||||||
|
|
||||||
// Render all dirty dialogs
|
// Draw and render all dirty dialogs
|
||||||
myDialogStack.applyAll([&](Dialog*& d) {
|
myDialogStack.applyAll([&](Dialog*& d) {
|
||||||
if(d->needsRedraw())
|
if(d->needsRedraw())
|
||||||
d->redraw();
|
d->redraw();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void DialogContainer::render()
|
||||||
|
{
|
||||||
|
if(myDialogStack.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
cerr << "render " << typeid(*this).name() << endl;
|
||||||
|
|
||||||
|
// Render all dirty dialogs
|
||||||
|
myDialogStack.applyAll([&](Dialog*& d) {
|
||||||
|
d->render();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
bool DialogContainer::needsRedraw() const
|
bool DialogContainer::needsRedraw() const
|
||||||
{
|
{
|
||||||
|
|
|
@ -124,6 +124,11 @@ class DialogContainer
|
||||||
*/
|
*/
|
||||||
void draw(bool full = false);
|
void draw(bool full = false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Render the stack of menus.
|
||||||
|
*/
|
||||||
|
void render();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Answers whether a full redraw is required.
|
Answers whether a full redraw is required.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue