Dans mon projet
GEngin, je suis confronté à la lenteur de GDI+.
Au fait je me suis rendu compte que la fonction la plus lente dans l'affichage est
_GDIPlus_GraphicsDrawImageRect (8 à 12 ms!)
Voila en gros comment est constitué G-Engin:
► Afficher le texte
Code : Tout sélectionner
Func _GEng_Start($sTitle, $iW, $iH, $iX = -1, $iY = -1, $iStyle = -1, $iExtStyle = -1)
$__GEng_hGui = GuiCreate($sTitle, $iW, $iH, $iX, $iY, $iStyle, $iExtStyle)
If @error Then Return SetError(1, 0, 0)
; ---
$__GEng_WinW = $iW
$__GEng_WinH = $iH
; ---
_GDIPlus_Startup()
; ---
$__GEng_hGraphic = _GDIPlus_GraphicsCreateFromHWND($__GEng_hGui)
$__GEng_hBitmap = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $__GEng_hGraphic)
$__GEng_hBuffer = _GDIPlus_ImageGetGraphicsContext($__GEng_hBitmap)
; ---
;$__GEng_ScreenDC = _WinAPI_GetDC($__GEng_hGui)
;$__GEng_CompatibleDC = _WinAPI_CreateCompatibleDC($__GEng_ScreenDC)
; ---
GuiSetState(@SW_SHOW, $__GEng_hGui)
Return SetError(0, 0, 1)
EndFunc
Func _GEng_ScrUpdate()
Return _GDIPlus_GraphicsDrawImage($__GEng_hGraphic, $__GEng_hBitmap, 0, 0)
; --- Nouvelle méthode, fait gagner env. 2ms!
;Local $gdibitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($__GEng_hBitmap)
;_WinAPI_SelectObject($__GEng_CompatibleDC, $gdibitmap)
;_WinAPI_DeleteObject($gdibitmap)
;_WinAPI_BitBlt($__GEng_ScreenDC, 0, 0, $__GEng_WinW, $__GEng_WinH, $__GEng_CompatibleDC, 0, 0, 0x00CC0020) ; 0x00CC0020 = $SRCCOPY
EndFunc
; --------------------
_GEng_Start("test", 400, 300)
While 1 ; Boucle principale
; Calcule des position
; ---
; Placement des objets
_GDIPlus_GraphicsDrawImageRectRect($__GEng_hBuffer, ...)
_GDIPlus_GraphicsDrawImageRectRect($__GEng_hBuffer, ...)
_GDIPlus_GraphicsDrawImageRectRect($__GEng_hBuffer, ...)
; ---
; Et enfin, mise à jour de l'écran
_GEng_ScrUpdate()
WEnd
Je me demandais, s'il ne serai pas possible de faire faire
_GEng_ScrUpdate par un autre script qui tournerai en parallèle du script principal, un autre thread en quelque sorte.
Puisque $__GEng_hGraphic et $__GEng_hBitmap sont des pointeurs (je pense), il suffit de transmettre leur valeur (adresse mémoire) au script annexe, et pas leur contenu (qui d’ailleurs change à chaque frame)
Des idées???