internal/ui: skip rendering onto the final framebuffer only for OpenGL

This was reverted at a049acd94e but now
I've confirmed this is not problematic only with OpenGL.

Updates #2341
Updates #2342
This commit is contained in:
Hajime Hoshi 2023-01-03 01:24:53 +09:00
parent 6b4c696b31
commit bbc82ef2db

View File

@ -198,20 +198,21 @@ func (c *context) drawGame(graphicsDriver graphicsdriver.Graphics, forceDraw boo
c.skipCount = 0
}
// TODO: If the offscreen is not updated and the framebuffers don't have to be updated, skip rendering to save GPU power
// (#2341, #2342). The condition would be `c.skipCount < maxSkipCount`.
// However, Metal (and maybe DirectX) cannot vsync without swapping the buffer by rendering the screen framebuffer (#2520).
if graphicsDriver.NeedsClearingScreen() {
// This clear is needed for fullscreen mode or some mobile platforms (#622).
c.screen.clear()
// TODO: Metal (and maybe DirectX) cannot vsync without swapping the buffer by rendering the screen framebuffer (#2520).
// Implement this skipping appropriately for Metal and DirectX.
if c.skipCount < maxSkipCount && graphicsDriver.IsGL() {
if graphicsDriver.NeedsClearingScreen() {
// This clear is needed for fullscreen mode or some mobile platforms (#622).
c.screen.clear()
}
c.game.DrawFinalScreen(c.screenScaleAndOffsets())
// The final screen is never used as the rendering source.
// Flush its buffer here just in case.
c.screen.flushBufferIfNeeded()
}
c.game.DrawFinalScreen(c.screenScaleAndOffsets())
// The final screen is never used as the rendering source.
// Flush its buffer here just in case.
c.screen.flushBufferIfNeeded()
return nil
}