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

Messages postés
90
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
27 juillet 2009
- - Dernière réponse : Renfield
Messages postés
17283
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
- 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 ?
Afficher la suite 

1 réponse

Messages postés
17283
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
56
0
Merci
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
Commenter la réponse de Renfield