
j'ai essayer de mélanger mon code avec ( 1° page de ce post ) , toujours le même problème... pas fluide , des saccades tout les 250ms environs...
Pas top la syncro , a voir en FullScreen ce que ca donne...
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 )
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, sprite(t)\vitesse, sprite(t)\vitesse)
; dessine le sprite
StartDrawing ( SpriteOutput (t))
Box (0,0, sprite(t)\vitesse, sprite(t)\vitesse, RGB ( Random (100)+100, Random (100)+100, Random (100)+100))
StopDrawing ()
Next t
; ***************************************************************
Repeat
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
FlipBuffers ( #PB_Screen_SmartSynchronization )
ClearScreen (0)
Delay (1) ;*
ExamineKeyboard ()
If KeyboardPushed ( #PB_Key_Escape )
End
EndIf
ForEver
Comme nous le rappelle si brillamment Dobro, FlipBuffers est d'une importance capitale. Alors conditionner l'affichage avec un ElapsedMilliseconds, c'est rajouter une couche de, heu, je sais pas quoi, mais bon tu vois.Cpl.Bator a écrit :Dobro , ton code est simple et expose clairement le problème ( que je ne vois pas sous linux au passage)
j'ai essayer de mélanger mon code avec ( 1° page de ce post ) , toujours le même problème... pas fluide , des saccades tout les 250ms environs...
Pas top la syncro , a voir en FullScreen ce que ca donne...
Ok, maintenant le Delay() est plus efficace, MERCI. Tout de fois mon exemple avec les BOX était pensé pour être un peu lourd, autrement j'aurais été même jusqu'à tout précalculer voir utiliser un autre API, revoir l'algo, et certain auraient utilisé de l'assembleur.Dobro a écrit :normal que ça saccade !!
un delay() doit se mettre APRES un flipbuffer ! pas avant !
si vous aviez fait du Stos basic, vous sauriez cela !!
parcequ'en Stos on manipulais directement le buffer de fond des sprites,
buffer video vu, et buffer video calculé ...
le flipbufer c'est un swap entre la memoire video calculé (celle ou se dessine le sprite) , et la memoire video affiché (celle qu'on vois..)
si tu met un delay() avant le swap, c'est normal qu'il y est une petite saccade
puisque tu empeche l'ecran d'apparaitre !!
met ton delay apres, tu verra
comme ça :
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(120) : Dim v(120) For y = 0 To 120 x(y) = Random(800) : v(y) = 1 + Random(4) Next y Repeat StartDrawing(ScreenOutput()) For y = 0 To 120 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 FlipBuffers(1) ClearScreen(0) Delay(10) ;* ForEver
de plus logiquement on met le clearscreen après l'affichage
puisque après l'affichage on met un coup de balais sur l'écran pour préparer le prochain travail
beaucoup on tendance a commencer par nettoyer avant de dessiner
personnellement je trouve plus logique de balayer ma surface de travail a la fin du travail
parce que c'est pas très malin d'arriver au boulot et de commencer a passer le balais
autre chose !!
les sprites sont pas la pour faire jolis !!
là tu dessine des box directement a l'écran !!
tu a choisi la technique la plus lente qui soit !!
si tu avait fait des sprites , tu aurai pu voir la difference !!
oui, certes, c'est une question d'organisation, la recommandation de Dobro n'est toutefois pas inutile.Buckethead a écrit : Je ne suis pas d'accord avec le Clearscreen(), car c'est la même chose.
Repeat
ClearScreen(0)
...
FlipBuffers(1)
ForEver
ou
Repeat
...
FlipBuffers(1)
ClearScreen(0)
ForEver
tu fais bien comme tu veux !!Buckethead a écrit :Perso, je préfère effacer l'écran juste àprès le repeat, je ne vois pas le problème d'organisation.
ton article est intéressant, cependant c'est pas le problème que nous démontrons !!comtois a écrit :C'est à vous de gérer le temps dans un jeu, voir cet article, notamment le chapitre 'Gestion du temps'
@Buckethead , les instructions sont effectué dans le même ordre , ca n'a pas d'importance , juste une manière de faire.Dobro a écrit :bon laisse tomber ...Buckethead a écrit :C'est comme dire à un gaucher qu'il code à l'envers, dans la routine la permutation entre les 2 instructions sont identiques:
ClearScreen(0)
code
FlipBuffers(1)
ClearScreen(0)
code
FlipBuffers(1)
ClearScreen(0)
code
FlipBuffers(1)