Page 1 sur 2

Parallaxe - Test de code

Publié : dim. 22/mars/2009 18:08
par Ollivier
Au secours, l'autre post est ingérable !

Donc, je poste la réponse du code de Dobro ici pour les histoires de performances (fluidité/stabilité du multitâche)

J'attends des commentaires éventuels. Merci beaucoup.

Code : Tout sélectionner

   Structure sprite
      X.l
      Y.l
      Vitesse.l
   EndStructure

   nbr_sprite=1000
   Dim sprite.sprite(nbr_sprite)

; Test
EcranX = GetSystemMetrics_(#SM_CXSCREEN)
EcranY = GetSystemMetrics_(#SM_CYSCREEN)
InitSprite(): InitKeyboard()

;hwnd=OpenWindow(1,0,0,EcranX,EcranY,"test", #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget  )
OpenWindow(0, 0, 0, EcranX, EcranY, "", $80000000)
OpenWindowedScreen(WindowID(0), 0, 0, EcranX, EcranY, 0, 0, 0)
;OpenScreen (EcranX,EcranY,32,"Test")

; *********** prepare les parametres de chaque sprite *****************
;For t=0 To nbr_sprite
;    sprite(t)\x = Random(EcranX)+1
;    sprite(t)\y= Random(EcranY)+1
;    sprite(t)\vitesse=Random(4)+1
;  CreateSprite(t, 4 * sprite(t)\vitesse, sprite(t)\vitesse)
;    ; dessine le sprite
;StartDrawing(SpriteOutput(t))
;    Box(3 * sprite(t)\vitesse,0, sprite(t)\vitesse, sprite(t)\vitesse,RGB(Random(100)+100,Random(100)+100,Random(100)+100))
;StopDrawing()

;Next t
; ***************************************************************

   CreateSprite(0, 2 * EcranX, EcranY)
   StartDrawing(SpriteOutput(0) )
      For i = 0 To 999
     
         Box(Random(2 * EcranX - 1), Random(EcranY - 1), 4, 4, RGB(Random(255), Random(255), Random(255) ) )
     
      Next i
   StopDrawing()
   
Global Dim x_.F(15)
Global Dim V_.F(15)
Nb_ = 3
For I = 0 To Nb_
V_(I) = 4.0 / Pow(2, I)
Next I
Repeat
  go= ElapsedMilliseconds()
    ;For t= 0 To nbr_sprite
    ;    DisplaySprite(t,sprite(t)\x,sprite(t)\y)
    ;   
    ;    sprite(t)\x=sprite(t)\x+sprite(t)\vitesse
    ;    If   sprite(t)\x>EcranX
    ;        sprite(t)\x=0
    ;    EndIf
    ;   
    ;Next t
    For I = Nb_ To 0 Step -1
         If I = Nb_
            DisplaySprite(0, x_(I), 0)
            DisplaySprite(0, x_(I) - 2.0 * EcranX, 0)
         Else   
            DisplayTransparentSprite(0, x_(I), 0)
            DisplayTransparentSprite(0, x_(I) - 2.0 * EcranX, 0)
         EndIf   
         x_(I) + V_(I)
         If x_(I) > EcranX
            x_(I) = 0 - EcranX
         EndIf
       
    Next I
   
    temps=ElapsedMilliseconds()-go
    StartDrawing(ScreenOutput())
        DrawText(10,10,"Temps: "+Str(temps))
    StopDrawing()
   
   
 

    ExamineKeyboard()
    If  KeyboardPushed(#PB_Key_Escape)
        End
    EndIf
         WindowEvent()
        FlipBuffers()
        ;ClearScreen(0)
        Clic.I + 1
        Clic & 3
        If Clic = 0: Delay(1): EndIf
       
ForEver 

Publié : dim. 22/mars/2009 18:20
par Huitbit
Pas glop

Pas fluide, petit sablier menaçant à la place du pointeur de la souris.
PureBasic 4.30 (Windows - x86)

A propos du scrolling parallaxe, y a-t-il des règles définies pour le calcul de la vitesse des différents plans ou est-ce tout simplement arbitraire ?
Il paraît que c'est "moon patrol", le premier jeu utilisant cet effet.

Hasta la vista !

Publié : dim. 22/mars/2009 18:21
par Buckethead
up :p (marche pas avec ma version de PB)
Ca ne sera jamais parfaitement fluide.

Publié : dim. 22/mars/2009 18:27
par tmyke
Heuu, je ne fait que passer, et je suis pas un spécialiste de la 2D, mais le code donné
ci-dessus est parfaitement fluide sur un portable qui est composé de:
PentiumM 1.6GHz - XP Family SP2 - ATI9700 mobility - 512Mo RAM.

Si cela peut aider...

Voilà ;) A++

Publié : dim. 22/mars/2009 18:28
par Ollivier
@HuitBit

Salut!

Tu vas me décrire en détail la configuration de ton PC. ça va m'aider. Parce que sur ma daube, ça roule.

J'ai rajouté un WindowEvent() pour enlever le sablier qui te "menaçait".

Pour le calcul, je pense que oui, il doit y avoir un calcul à faire selon la distance que l'on veut "suggérer" en tant qu'illusion.

Mon calcul, ici est arbritraire. (1, 1/2, 1/4 et 1/8...)

Ollivier

Publié : dim. 22/mars/2009 18:33
par Ollivier
@Tmyke

Je te remercie beaucoup pour ta réponse.

Ollivier

Publié : dim. 22/mars/2009 19:01
par Kwai chang caine
Tres tres legere saccade
Joli ciel étoilé en couleur 8)

Publié : dim. 22/mars/2009 19:03
par Backup
oui ! tres fluide !! :)

comme quoi le clearscreen est peut etre a revoir par fred !! ...

Publié : dim. 22/mars/2009 19:11
par Huitbit
Et voilà !

(merci M'ssieur heisspiter)

Image

carte graphique :
ATI radeon xpress 200

Plus de sablier mais...maintenant, en plus des saccades, il y a des flashes blancs au début avec ou sans débogueur ! :mrgreen:

Ciao !

Publié : dim. 22/mars/2009 19:20
par Buckethead
Il y a des saccades. Comparable à tous les autres tests. (et sans le debogueur)
J'avais aussi tenté d'appeler Delay() une fois sur n frame.
On se rapproche du truc sans delay(), avec un sursaut à chaque appel de delay().
Je suis à 30cm d'un écran LCD 22" @60Hz (~)
8800 GTS 320

Publié : dim. 22/mars/2009 19:25
par Huitbit
@Buckethead
Voilà le seul code (le tien!) qui ne saccade pas chez moi !

Code : Tout sélectionner

; Test 
InitSprite() 
hwnd=OpenWindow(1,0,0,800,600,"test", #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget  ) 
OpenWindowedScreen (hwnd,0,0,800,600,0,0,0) 

Dim x(1000) : Dim v(1000) 
For y = 0 To 1000
 x(y) = Random(800) : v(y) = 1 + Random(4) 
Next y 

Repeat 
ClearScreen(0) 

StartDrawing(ScreenOutput()) 
 For y = 0 To 1000
  x(y) = x(y) + v(y) 
   If x(y) > 800 : x(y) = 0 : EndIf 
  c = 100 +v(y) * 25 
  Box(x(y), 5*y, v(y), v(y) ,RGB(c,c,c)) 
 Next y 
StopDrawing() 

If WindowEvent() = #PB_Event_CloseWindow : End : EndIf 

Delay(1) 

FlipBuffers(1) 
ForEver 

Publié : dim. 22/mars/2009 19:28
par Buckethead
moi il saccade comme les autres versions, a chaque incrément.
Par contre si tu retires delay(1) (qui était mal placé) il y a une sensation de fluidité avec un frame drop environ toutes les 15 frames. Il est inutile d'afficher plus de 30 étoiles pour exposer le problème: ca ne fait qu'intervenir des problème d'optimisation, alors que dans mon exemple on pouvait ce permettre une instruction lourde & variable.

Publié : dim. 22/mars/2009 19:38
par Huitbit
@Buckethead

Pour ton code,

tel que je l'ai posté, aucun problème.

Si je mets le delay(1) après le flipbuffers(), là ça saccade un peu !
:?

Si je l'enlève, saccades plus importantes
:? :?

Publié : dim. 22/mars/2009 19:41
par Buckethead
haha quelle embrouille :p

Publié : dim. 22/mars/2009 19:41
par beauregard
Buckethead a écrit :moi il saccade
pas de saccade( hors accès disque dur bien sûr):

Code : Tout sélectionner

; Test
InitSprite()
hwnd=OpenWindow(1,0,0,800,600,"test", #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget  )
OpenWindowedScreen (hwnd,0,0,800,600,0,0,0)
Dim x(1000) : Dim v(1000)
For y = 0 To 1000
 x(y) = Random(800) : v(y) = 1 + Random(4)
Next y
Repeat
StartDrawing(ScreenOutput())
 For y = 0 To 1000
  x(y) = x(y) + v(y)
   If x(y) > 800 : x(y) = 0 : EndIf
  c = 100 +v(y) * 25
  Box(x(y), 5*y, v(y), v(y) ,RGB(c,c,c))
 Next y
StopDrawing()
If WindowEvent() = #PB_Event_CloseWindow : End : EndIf
Delay(1)
FlipBuffers(1)
ClearScreen(0)
ForEver
Huitbit a écrit : Si je mets le delay(1) après le flipbuffers(), là ça saccade un peu !
le delay avant le flipbuffer, je le note. :)
Buckethead a écrit :haha quelle embrouille :p
pourquoi reste-tu en 4.20 ?