Incohérence de performance avec la fonction "BitBlt" ?

MouLeT Messages postés 90 Date d'inscription samedi 11 octobre 2003 Statut Membre Dernière intervention 27 juillet 2009 - 27 juil. 2009 à 01:31
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 27 juil. 2009 à 09:02
Bonsoir à tous, je viens depuis pas longtemps recommencer à programmer afin de créer un petit jeu 2D.
Cependant j'ai remarqué quelque chose qui me semble incohérent concernant les performances en utilisant la fonction BitBlt.

Voici une partie de mon code :
Option Explicit
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
'[...]
Private Sub Jeu()
'[...]
Do
    DoEvents
    '[...]
    FOND.Refresh 'AutoRedraw de la PictureBox FOND : True
    For BCL = 1 To TOBJ
        If (PicPos(BCL, 1) < FOND.ScaleWidth And PicPos(BCL, 1) + PicSize(BCL, 1) > 0) _
        And (PicPos(BCL, 2) < FOND.ScaleHeight And PicPos(BCL, 2) + PicSize(BCL, 2) > 0) Then
        Select Case PicType(BCL)
            Case 0
            BitBlt FOND.hDC, PicPos(BCL, 1), PicPos(BCL, 2), PicSize(BCL, 1), PicSize(BCL, 2), PIC(PicPath(BCL)).hDC, PicDeb(BCL, 1), PicDeb(BCL, 2), SRCCOPY
            Case 1
            BitBlt FOND.hDC, PicPos(BCL, 1), PicPos(BCL, 2), PicSize(BCL, 1), PicSize(BCL, 2), PIC(PicPath(BCL)).hDC, PicDeb(BCL, 1) + PIC(PicPath(BCL)).ScaleWidth / 2, PicDeb(BCL, 2), SRCAND
            BitBlt FOND.hDC, PicPos(BCL, 1), PicPos(BCL, 2), PicSize(BCL, 1), PicSize(BCL, 2), PIC(PicPath(BCL)).hDC, PicDeb(BCL, 1), PicDeb(BCL, 2), SRCPAINT
        End Select
        End If
    Next
Loop
End Sub

Après avoir testé le code sur mon pc (E8400 3.0Ghz sous Windows Seven, Core utilisé à 100%) j'atteins "seulement" 350 FPS.
Sur mon ancien PC (Athlon XP 2200+ sous Windows XP SP0, Core utilisé à 30%) j'atteins près de 3000 FPS ... (c'est la carte graphique qui limite le nombre de FPS en étant utilisée à 100% !)
Je tourne aussi vers 300 FPS sur un ordinateur portable (T5200 1.6Ghz sous Windows XP SP3)

Quelle est la raison de cette différence de performance ? Comment y remédier ?

1 réponse

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 juil. 2009 à 09:02
tu ne dois pas utiliser une telle boucle.

selon la puissance de ton poste, tu aura des accelerations par rapport a d'autrers postes.

effectue tes boucles avec un delta, fonction du temps écoulé depuis la dernière frame.

ainsi, si ton poste a une activité intense soudaine, delta augmentera et le mouvement sera plus saccadé, mais aussi rapide.

voir:

http://www.vbfrance.com/codes/VITESSE-BOUCLE_43642.aspx


Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
Rejoignez-nous