How to use MiniGUI's synchronous update mechanism to reduce screen flicker.
Table of Contents
Overview
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 the synchronous update mechanism to reduce screen flicker.
Usage
- Including option
--enable-syncupdate
when configuring MiniGUI. - Using a shadow 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.
Restrictions
The synchronous update mechanism provides an easy way to reduce the screen flicker. However, it has the following restrictions:
- It only works with low 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.