Parallaxe - Test de code

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Parallaxe - Test de code

Message 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 
Dernière modification par Ollivier le dim. 22/mars/2009 18:30, modifié 1 fois.
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message 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 !
Dernière modification par Huitbit le dim. 22/mars/2009 18:21, modifié 1 fois.
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

up :p (marche pas avec ma version de PB)
Ca ne sera jamais parfaitement fluide.
Dernière modification par Buckethead le dim. 22/mars/2009 18:44, modifié 1 fois.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message 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++
Force et sagesse...
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message 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
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@Tmyke

Je te remercie beaucoup pour ta réponse.

Ollivier
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Tres tres legere saccade
Joli ciel étoilé en couleur 8)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

oui ! tres fluide !! :)

comme quoi le clearscreen est peut etre a revoir par fred !! ...
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message 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 !
Dernière modification par Huitbit le dim. 22/mars/2009 19:21, modifié 1 fois.
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message 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
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message 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 
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message 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.
Dernière modification par Buckethead le dim. 22/mars/2009 19:40, modifié 2 fois.
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message 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
:? :?
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

haha quelle embrouille :p
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message 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 ?
Dernière modification par beauregard le dim. 22/mars/2009 20:02, modifié 1 fois.
Répondre