Page 1 sur 2

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

Publié : sam. 29/oct./2005 18:29
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

Publié : sam. 29/oct./2005 18:36
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

Publié : sam. 29/oct./2005 18:52
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

Publié : sam. 29/oct./2005 18:55
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.

Publié : sam. 29/oct./2005 19:08
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

Publié : sam. 29/oct./2005 19:16
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.

Publié : sam. 29/oct./2005 19:20
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:

Publié : sam. 29/oct./2005 19:21
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:

Publié : sam. 29/oct./2005 19:21
par Pierre
moi j'ai: 16, 15, 0
...

Publié : sam. 29/oct./2005 19:22
par Dräc
Donc, aucune distinction pour vous ! :evil:

Publié : sam. 29/oct./2005 19:23
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

Publié : sam. 29/oct./2005 19:29
par Backup
moi ça passe de 31---32---31 ect ..


P4 2.8 Go Fx 5700 Fsb 800 :)

Publié : dim. 30/oct./2005 2:29
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

Publié : dim. 30/oct./2005 2:39
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.

Publié : dim. 30/oct./2005 10:12
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 ;) ) ?