GDI+ Double Buffering

Daca ati folosit functiile GDI+ pentru desenare, probabil ati observat inconvenientul cauzat de multiple operatii de desenare pe ecran, care cauzeaza un tremur al imaginii (flickers). Acest lucru se poate observa usor intr-o bucla in care se simuleaza miscarea unui obiect.

 

In exemplul de mai jos simulam miscare unui patrat, de culoare albastra, din partea stanga spre partea dreapta a ferestrei (observati inconvenientul despre care vorbeam putin mai sus).

#include <GDIPlus.au3>
 
$hMain = GUICreate("Exemplu")
GUISetState(@SW_SHOW,$hMain)
 
_GDIPlus_Startup()
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hMain)
$hBrush = _GDIPlus_BrushCreateSolid(0xFF000080)
 
For $X = 0 To 400
	_GDIPlus_GraphicsClear($hGraphics,0xFF000000)
	_GDIPlus_GraphicsFillRect($hGraphics,$X,180,40,40,$hBrush)
	Sleep(10)
Next
 
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()

 

Acest inconvenient dispare daca vom folosi tehnica numita Double Buffering. Aceasta tehnica consta in crearea unui buffer in memorie in care vor fi randate toate operatiile de desenare, in loc sa fie desenate pe ecran. Dupa ce sunt finalizate toate operatiile de desenare bufferul este copiat pe suprafata de desenare asociata acestuia. Daca ati prins ideea, este utilizata doar o operatie de desenare pe ecran, astfel inconvenientul provocat de desenarile multiple dispare.

 

Acelasi exemplu in care simulam miscarea patratului dar de aceasta data imaginea este stabila.

 

#include <GDIPlus.au3>
 
$hMain = GUICreate("Exemplu")
GUISetState(@SW_SHOW,$hMain)
 
_GDIPlus_Startup()
; Suprafata de desenare
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hMain)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics(400,400,$hGraphics)
; Suprafata de desenare din memorie (buffer)
$hBackBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
$hBrush = _GDIPlus_BrushCreateSolid(0xFF000080)
 
For $X = 0 To 400
	; Operatii de desenare in buffer
	_GDIPlus_GraphicsClear($hBackBuffer,0xFF000000)
	_GDIPlus_GraphicsFillRect($hBackBuffer,$X,180,40,40,$hBrush)
	; Desenare pe ecran
	_GDIPlus_GraphicsDrawImage($hGraphics,$hBitmap,0,0)
	Sleep(10)
Next
 
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hBackBuffer)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()

* Pentru orice intrebari sau nelamuriri legate de curs sau limbajul AutoIt accesati sectiunea AutoIt a forumului SkullBox sau platforma de suport tehnic NetHelp.