Vitesse d’exécution : une constatation frappante sur mon PC

Sujets variés concernant le développement en PureBasic
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Vitesse d’exécution : une constatation frappante sur mon PC

Message par Dräc »

Voici un programme qui affiche une série de sprites à l’écran et indique le temps mit.

Si j’exécute 2 fois le programme sans les supprimer, je constate que le temps mit par la deuxième instance est bien plus court 8O .

Constaté vous la même chose chez vous ?
Pourquoi la deuxième instance a mit moins de temps que la première !!!!???

Attention : Il est clair que les perfo dépendent grandement de la configuration de l’ordi.
Probablement qu’avec les conf actuelles, vous ne voyez rien, mais moi avec mon pauvre PIII 500 et Win98, je sens une nette différence : j’ai un facteur > 20 à 200!


C’est probablement un problème de gestion de mémoire.
Je ne sais pas dire si c’est Win98 ou PB que s’emmêle.

C’est très gênant pour la joueabilité de mon jeu à vrai dire :x, dans lequel je rafraîchis la carte à chaque boucle
C’est surtout une situation intrinsèquement inextricable :? !

Quelqu’un a une explication et un remède ?

Code : Tout sélectionner

InitSprite()

  #Width=32
  #Height=32
  #WindowWidth=22*#Width
  #WindowHeight=14*#Height
  #NbDisplaySprite = #WindowWidth/#Width * #WindowHeight/#Height
  #NbSprite = #NbDisplaySprite
  
  If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight, #PB_Window_SystemMenu|#PB_Window_ScreenCentered, "Boxes") And OpenWindowedScreen(WindowID(), 0, 0, #WindowWidth, #WindowHeight, 0, 0, 0)
    AddKeyboardShortcut(0,#PB_Shortcut_F1, #PB_Shortcut_F1)
    
    For k = 0 To #NbSprite-1
    CreateSprite(k, #Width, #Height, #PB_Sprite_Memory)

      If StartDrawing(SpriteOutput(k)); Dessine le Sprite
        y = 0
        #StepX = 2
        StepY = Round(#StepX*#Height/#Width, 0)
        For x = 0 To #Width/2 Step #StepX
          Box(x, y, #Width-2*x, #Height-2*y ,RGB(Random(255),Random(255),Random(255)))
          y + StepY
        Next x
        ;Locate(#Width/3, #Height/3) : DrawText(Str(k))
        StopDrawing()
      EndIf
    
    Next
    
    ;Affichage des sprites

      k=0
      tps = GetTickCount_()
      For x = 0 To #WindowWidth-1 Step #Width
        For y= 0 To #WindowHeight-1 Step #Height
          DisplaySprite(k, x, y)
          DisplaySprite(k%#NbSprite, x, y)
          k+1
        Next
      Next
      tps = GetTickCount_() - tps

  
      If  StartDrawing( ScreenOutput() )
        Locate( 0, 0)
        DrawText( "TPS:"+Str(tps) )
        StopDrawing()
      EndIf 
      FlipBuffers()
    
    Repeat
    Until WindowEvent() = #PB_Event_CloseWindow
  EndIf
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Premier lancement 31
2 eme lancement 16

Belle différence quand même! :?

Au deuxième lancement, tes sprites sont toujours en mémoire! Je ne vois que ça

Athlon XP2000+
1.67 GHz - 256 Mo Ram
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Ce n'est pas ca!
Les programmes utilisent les memes indices des sprites, mais après compilation il n'y a pas d'interférence. Ils sont bien dans des adresses mémoires différentes.

Aussi regarde avec ca.
J'ai juste déplacé le "Repeat" pour forcer à ré-afficher les sprite à l'écran à chaque boucle.
La différence entre les temps d'affichage demeurent...

Code : Tout sélectionner

InitSprite()

  #Width=32
  #Height=32
  #WindowWidth=22*#Width
  #WindowHeight=14*#Height
  #NbDisplaySprite = #WindowWidth/#Width * #WindowHeight/#Height
  #NbSprite = #NbDisplaySprite
  
  If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight, #PB_Window_SystemMenu|#PB_Window_ScreenCentered, "Boxes") And OpenWindowedScreen(WindowID(), 0, 0, #WindowWidth, #WindowHeight, 0, 0, 0)
    AddKeyboardShortcut(0,#PB_Shortcut_F1, #PB_Shortcut_F1)
    
    For k = 0 To #NbSprite-1
    CreateSprite(k, #Width, #Height, #PB_Sprite_Memory)

      If StartDrawing(SpriteOutput(k)); Dessine le Sprite
        y = 0
        #StepX = 2
        StepY = Round(#StepX*#Height/#Width, 0)
        For x = 0 To #Width/2 Step #StepX
          Box(x, y, #Width-2*x, #Height-2*y ,RGB(Random(255),Random(255),Random(255)))
          y + StepY
        Next x
        ;Locate(#Width/3, #Height/3) : DrawText(Str(k))
        StopDrawing()
      EndIf
    
    Next
    
    ;Affichage des sprites
    Repeat
      k=0
      tps = GetTickCount_()
      For x = 0 To #WindowWidth-1 Step #Width
        For y= 0 To #WindowHeight-1 Step #Height
          DisplaySprite(k, x, y)
          DisplaySprite(k%#NbSprite, x, y)
          k+1
        Next
      Next
      tps = GetTickCount_() - tps

  
      If  StartDrawing( ScreenOutput() )
        Locate( 0, 0)
        DrawText( "TPS:"+Str(tps) )
        StopDrawing()
      EndIf 
      FlipBuffers()
    
    
    Until WindowEvent() = #PB_Event_CloseWindow
  EndIf
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Ah ben là, TPS varie rapidement entre 15 et 35, même pas le temps de lire :lol:

Par contre, à chaque lancement, ça a l'air d'être les mêmes valeurs.
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Est-ce plus convainquant avec un Delay(1000) ? :)

Code : Tout sélectionner

InitSprite()

  #Width=32
  #Height=32
  #WindowWidth=22*#Width
  #WindowHeight=14*#Height
  #NbDisplaySprite = #WindowWidth/#Width * #WindowHeight/#Height
  #NbSprite = #NbDisplaySprite
  
  If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight, #PB_Window_SystemMenu|#PB_Window_ScreenCentered, "Boxes") And OpenWindowedScreen(WindowID(), 0, 0, #WindowWidth, #WindowHeight, 0, 0, 0)
    AddKeyboardShortcut(0,#PB_Shortcut_F1, #PB_Shortcut_F1)
    
    For k = 0 To #NbSprite-1
    CreateSprite(k, #Width, #Height, #PB_Sprite_Memory)

      If StartDrawing(SpriteOutput(k)); Dessine le Sprite
        y = 0
        #StepX = 2
        StepY = Round(#StepX*#Height/#Width, 0)
        For x = 0 To #Width/2 Step #StepX
          Box(x, y, #Width-2*x, #Height-2*y ,RGB(Random(255),Random(255),Random(255)))
          y + StepY
        Next x
        ;Locate(#Width/3, #Height/3) : DrawText(Str(k))
        StopDrawing()
      EndIf
    
    Next
    
    ;Affichage des sprites
    Repeat
      k=0
      tps = GetTickCount_()
      For x = 0 To #WindowWidth-1 Step #Width
        For y= 0 To #WindowHeight-1 Step #Height
          DisplaySprite(k, x, y)
          DisplaySprite(k%#NbSprite, x, y)
          k+1
        Next
      Next
      tps = GetTickCount_() - tps
      Delay(1000)
  
      If  StartDrawing( ScreenOutput() )
        Locate( 0, 0)
        DrawText( "TPS:"+Str(tps) )
        StopDrawing()
      EndIf 
      FlipBuffers()
    
    
    Until WindowEvent() = #PB_Event_CloseWindow
  EndIf
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Pareil, ça varie entre 15 et 31 sauf que cette fois, j'ai le temps de lire. :lol:

Et c'est les mêmes valeurs à tous les lancements.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Oui, ça fait une valeur moyenne à 16 avec des pics mais bon!... Disons 16
Et je peux lancer plusieurs fois le prog, j'ai toujours la même vitesse

[Edité]
Arrrggghhhh!!!!! :roll:
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Chris a écrit :Pareil, ça varie entre 15 et 31
Et c'est les mêmes valeurs à tous les lancements.
Tu veux dire que s'il y a deux instances, les deux varient entre 15 et 31 ?
Chris a écrit : sauf que cette fois, j'ai le temps de lire. :lol:
:wink:
Pierre
Messages : 244
Inscription : ven. 23/janv./2004 20:29
Localisation : 77 (Région parisienne)

Message par Pierre »

moi j'ai: 16, 15, 0
...
Image
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Donc, aucune distinction pour vous ! :evil:
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Dräc a écrit :
Chris a écrit :Pareil, ça varie entre 15 et 31
Et c'est les mêmes valeurs à tous les lancements.
Tu veux dire que s'il y a deux instances, les deux varient entre 15 et 31 ?
Chris a écrit : sauf que cette fois, j'ai le temps de lire. :lol:
:wink:
Non, dans le même prog, ça passe de 16 à 31
15 -- 31 -- 15 -- 31
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

moi ça passe de 31---32---31 ect ..


P4 2.8 Go Fx 5700 Fsb 800 :)
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Je ne suis pas sur que l’on se comprenne. Pour etre certain, je me permet de exposer à nouveau le problème:

Si vous lancez le programme pour avoir deux executions de ce dernier en simultanées, c’est à dire deux fenetres affichées à l’écran, l’une affiche (chez moi) un TPS vraiement différent de l’autre.
Sinon, oui, le TPS d’une fenetre peut fluctuer légèrement (c’est le cas chez moi)

Voici une p’tite image pour illustrer :
Image
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Si un deuxième lancement est plus rapide, c'est normal : cela s'explique par le fonctionnement même d'un système d'exploitation.
Un OS comme Windows garde en mémoire et pendant un temps donné un bout des programmes dernièrement lancés en mémoire : pour s'en convaincre faite le test avec une application lourde au démarrage (OpenOffice 2.0 par exemple), il passe d'environ 6 à 2 secondes.
"Qui baise trop bouffe un poil." P. Desproges
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Je suis d’accord avec toi, mais là n’est pas le sujet !

En effet, ici, les deux programmes fonctionnent simultanément en mémoire et l’un s’exécute plus rapidement que l’autre, ceci à chaque seconde.

Pourquoi l'un d'eux bénéficit de cette accélération alors que les deux programmes sont sensés faire la meme chose?

Mais déjà, constatez vous une différence comme sur l'image (en relatif bien sur ;) ) ?
Répondre