-
Notifications
You must be signed in to change notification settings - Fork 156
Using SyncUpdateDC to Reduce Screen Flicker
How to use MiniGUI's synchronous update mechanism to reduce screen flicker.
Table of Contents
In the development of a GUI app, we often need to update an area on the screen multiple times just for a user input. For example, if the user presses the up and down keys, the highlighted item in the list box will change. At this point, the program should perform the following operations:
- Erase the original highlighted item with the background color of a normal item;
- Draw the text of the original highlighted item with the foreground color of the normal item;
- Erase the new highlighted item with the background color of the highlighted item;
- Draw the text of the new highlighted item with the foreground color of the highlighted item.
This frequent drawing will cause the screen to flicker if we don't do any special processing.
Generally, we can use one of the following ways to eliminate this flicker:
- Create a memory DC and draw content to the memory DC first, then
call
BitBlt
to blit the content to screen. - Use MiniGUI's double buffer main window. This is essentially the same as the first method.
- Use the new synchronous update mechanism introduced in MiniGUI 3.2.x.
This documents describes how to use the new synchronous update mechanism to reduce the screen flicker.
Essentially, the new synchronous update mechanism uses a shadow frame
buffer for MiniGUI, and refresh the content that needs to be updated to
the screen at one time, by calling SyncUpdateDC
function.
In this way, we do not need to create and destroy memory DC frequently, so we will get a certain degree of performance improvement. And the MiniGUI app's code can keep as simple as possible. In other words, we can improve the maintainability of the code as well.
- Including option
--enable-syncupdate
when configuring MiniGUI. - Using a shadow-like NEWGAL engine and implementing
UpdateRects
method of your NEWGAL engine to update the dirty regions to your real screen frame buffer. - Calling
SyncUpdateDC(HDC_SCREEN)
when you want to update the screen. Generally, you can call this function after callingEndPaint
function when handlingMSG_PAINT
message.
The synchronous update mechanism provides an easy way to reduce the screen flicker. However, it has the following restrictions:
- It is not suitable to a screen with high resolution.
- It may hide the side effects of some inefficient code in your MiniGUI app.
- It lacks support for hardware acceleration.
Therefore, for modern graphics stack (system shipped with a GPU), the better way is using off-screen surface and exploiting the hardware acceleration as far as possible.