Browse Source

Implemented lazy totalRedraw to prevent multiple redraws on single frame

Ivan Savenko 2 years ago
parent
commit
bb17cc13b1
3 changed files with 25 additions and 7 deletions
  1. 16 0
      client/gui/WindowHandler.cpp
  2. 8 0
      client/gui/WindowHandler.h
  3. 1 7
      client/mainmenu/CMainMenu.cpp

+ 16 - 0
client/gui/WindowHandler.cpp

@@ -99,6 +99,12 @@ bool WindowHandler::isTopWindow(IShowActivatable * window) const
 
 void WindowHandler::totalRedraw()
 {
+	totalRedrawRequested = true;
+}
+
+void WindowHandler::totalRedrawImpl()
+{
+	logGlobal->debug("totalRedraw requested!");
 	CSDL_Ext::fillSurface(screen2, Colors::BLACK);
 
 	Canvas target = Canvas::createFromSurface(screen2);
@@ -109,6 +115,16 @@ void WindowHandler::totalRedraw()
 }
 
 void WindowHandler::simpleRedraw()
+{
+	if (totalRedrawRequested)
+		totalRedrawImpl();
+	else
+		simpleRedrawImpl();
+
+	totalRedrawRequested = false;
+}
+
+void WindowHandler::simpleRedrawImpl()
 {
 	//update only top interface and draw background
 	if(windowsStack.size() > 1)

+ 8 - 0
client/gui/WindowHandler.h

@@ -20,9 +20,17 @@ class WindowHandler
 	/// Temporary list of recently popped windows
 	std::vector<std::shared_ptr<IShowActivatable>> disposed;
 
+	bool totalRedrawRequested = false;
+
 	/// returns top windows
 	std::shared_ptr<IShowActivatable> topWindowImpl() const;
 
+	/// forces total redraw (using showAll), sets a flag, method gets called at the end of the rendering
+	void totalRedrawImpl();
+
+	/// update only top windows and draw background from buffer, sets a flag, method gets called at the end of the rendering
+	void simpleRedrawImpl();
+
 public:
 	/// forces total redraw (using showAll), sets a flag, method gets called at the end of the rendering
 	void totalRedraw();

+ 1 - 7
client/mainmenu/CMainMenu.cpp

@@ -337,13 +337,7 @@ void CMainMenu::update()
 
 	// Handles mouse and key input
 	GH.handleEvents();
-
-	Canvas canvas = Canvas::createFromSurface(screen);
-
-	// check for null othervice crash on finishing a campaign
-	// /FIXME: find out why GH.windows().listInt is empty to begin with
-	if(GH.windows().topWindow<CIntObject>())
-		GH.windows().topWindow<CIntObject>()->show(canvas);
+	GH.windows().simpleRedraw();
 }
 
 void CMainMenu::openLobby(ESelectionScreen screenType, bool host, const std::vector<std::string> * names, ELoadMode loadMode)