Performance d'un jeu en 2D

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

faudrait tester si vous aviez encore la V3.94

bong sang ! il me semble bien qu'avant la 4.00 c'etait mieux fluide !!

d'ailleurs mes jeux "Purenoide" le demontre bien
ils ont ete compillé avec ces anciennes version de purebasic

lorsque j'aurai un moment je reverifierai ... :?

[Reedit]

ha bah non , je viens de tester avec la v3.94
et ça saccade aussi ! :?

c'est peut etre la faute du pack 3 d'XP ????
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Dobro a écrit :faudrait tester si vous aviez encore la V3.94
bonne idée
çà coince avec ClearScreen (0)
grml...
peux tu me rappeler ce qui faut taper exactement ?
solution -> ClearScreen (0,0,0)

je n'ai pas de sp3

j'y crois pas, waponez2 n'a pas de Clearscreen !

Ah! je m'attendez pas à voir çà: avec la 3.94, en plein écran c'est toute les étoiles qui saccade, comme Buckethead !

le coupable, enfin je crois: la dernière version de directx( que j'ai installé il y a peu)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Dobro a écrit :
;tout en flottants, c'est plus pratique et plus rapide
heu ! t'es sur ??

plus pratique , bon ok , cela permet de mieux jouer sur la vitesse éventuellement , mais pas pour les coordonnées puisqu'elle sont entière sur un pc X,y ce sont des coordonnées entiere !! donc les flottants ne se justifie pas , parce qu'on effectue un déplacement en ligne ..
bien sur si l'on fait intervenir les Cos(),et autre Sin() là c'est différent :)

ce qui m'interpelle c'est ton affirmation "et plus rapide" .....
en principe les flottants non pas la réputation d'etre plus rapide que les entiers !! de par la convertion en binaire, deja ....
On s'était amusé à tester sur le forum anglais... Là : http://www.purebasic.fr/english/viewtop ... sc&start=0 et là : http://www.purebasic.fr/english/viewtop ... r&start=30

Le résultat est surprenant, et tient surtout au processeur. Chez moi les floats sont bien souvent deux fois plus rapides que les entiers! J'invite tout le monde à faire des tests ;)
Les floats ont beaucoup d'autres avantages, comme permettre des simulations bien meilleures des conditions réelles. Il faut s'y faire, l'entier est "has been"! Quant aux coordonnées entières, si c'est bien pour les étoiles "devant", pour celles derrière, si on veut qu'elles avance à une vitesse de moins de 1 pixel par frame, ça oblige à faire des décalages et autres joyeusetés. Je connais ça par coeur ;)
Enfin, le binaire n'a absolument rien à voir là dedans. Tu devrais faire un peu d'assembleur (vraiment, c'est pas sorcier!) pour démystifier un peu tout ça; tu ferais des trucs terribles :)
Dobro a écrit :pour ce qui concerne les constantes , je ne suis pas vraiment pour,
pour une simple raison, lorsqu'on veux modifier le nombre de sprites par la suite dans le code (modif faite par le code), on ne peut pas , a moins de bidouiller ... :)

les constantes pour certains trucs, oui, mais pour moi, ça n'est pas automatique !! loin de là !! :)
Là c'est justement un cas d'école :)
Mais bon, -j'aime bien ramener ma fraise- ;), on s'en fout à notre époque, qu'est-ce que c'est quatre octets pour une variable?
de plus tu utilise une astucieuse façon de trier tes sprites , :)

mais c'est inutile, puisqu'on peut faire la meme chose sans tri :)
C'est vrai, on pourrait, c'était pour donner l'astuce, utile pour les vectors-balls :P
enfin ce code est tres bien conçu effectivement
Merci :)
cependant , pour en revenir a notre sujet
chez moi le déplacement des sprites n'est pas plus fluide !!

il est tantot acceléré , tantot ralenti , de façon uniforme, l'ensemble donne l'impression d'etre dans une boucle qui ne tournerai pas rond !:lol:


si Fred passe : franchement on a vraiment du mal sous windows a avoir un
déplacement de sprite qui ne soit pas influencé par les désidérata de windows , meme en plein ecran , et il me semble qu'avant en version 3.94
notamment , c'etait bien plus fluide !!

il n'y aurai pas un moyen qu'un prg purebasic est une reference
comme un VBL ou hbL (de dans le temps) , bref une impulsion
Réguliere, et fiable , qui fasse tourner notre application
sans tenir compte de l'ordonanceur windows ????
Pareil, c'est pas fluide ici non plus, de temps en temps ça saute. On peut essayer d'augmenter la priorité de notre tâche, mais rien de plus. PB se base déjà sur la VBL (quand elle existe), puisqu'il utilise DirectX (voir la doc de flipbuffers()). Sinon il utilise un timer. Mais ça ne sert à rien, Windows prend la main et te fait avoir un frame drop régulièrement, par exemple lors d'un accès au disque pour la mémoire virtuelle, ou un événement réseau.
Même avec des monstres de puissance, on a des frames drop! C'est pour ça que je parlais du motion blur comme l'une des seules alternatives pour avoir de la fluidité sur nos machines.
beauregard a écrit :
Buckethead a écrit :non, où qu'elles soient
chez moi en plein écran, c'est en bas uniquement que çà merdouille
Pareil avec le smartsynchro ;)
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

non le coupable, c'est le delay, arg !!!
résumer: pour avoir un défilement d'étoile bien fluide en plein écran, faut être sous la 3.94 et ne pas utiliser de delay. Buckethead, c'est à toi de jouer et de me dire si tu obtiens le même résultat...
Dernière modification par beauregard le dim. 22/mars/2009 15:42, modifié 1 fois.
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Anonyme

Message par Anonyme »

Désactivé la syncro vertical de vos cartes , ici c'est nickel , fluide. pas de saccade.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Juste quelques remarques sur le post de djes

Pour moi des entiers de la taille de ton processeur sont forcément plus rapides (surtout si on fait intervenir des calculs un tant soit peu évolués) que des nombres réels.

Les entiers sont "has been" ??? Entièrement d'accord avec toi. On est plus à une époque où on calquait le fonctionnement interne d'un "jeu" sur les coordonnées de l'écran. La 3D est un exemple on ne peut plus flagrant, ça reste valable pour de la 2D de mon point de vue. On n'a plus des machines limitées comme les anciennes consoles de salon qui se programmaient en assembleur et dont l'usage du moindre registre était fait avec parcimonie.

Tout ça pour dire qu'on est plus à l'époque des démos techniques d'affichage d'effet plasma qu'on fait tourner sur un bon vieux DOS avec en sortie un VGA de 320x200...

Un petit pavé dans la marre avec l'histoire du clearscreen. C'est cette commande qui bouffe le plus de ressources pour moi (en une seule fonction). Elle bouffe autant que FlipBuffers sans être réellement utile. Ce que je propose est très compliqué mais apporte de vrais gains de perfs... Ne redessiner que ce qui a changé d'une frame à l'autre!

Vous pensez que Windows redessine tout l'écran à chaque Frame pour un simple dépassement de souris ?

Dri ;)
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

beauregard a écrit :non le coupable, c'est le delay, arg !!!
résumer: pour avoir un défilement d'étoile bien fluide en plein écran, faut être sous la 3.94 et ne pas utiliser de delay. Buckethead, c'est à toi de jouer et de me dire si tu obtiens le même résultat...
Je suis sous PB 4.02, Windows XP SP2 (DirectX à jour)
j'ai mis en rem le tri et pour le flipbuffer essayé toutes les valeurs (0,1,2)
#PB_Screen_SmartSynchro = 2 non ?

Delay(1) ou pas la même "fluidité" par contre (pas fluide)
bref normal (je l'avais déjà constaté)


Mais en mode fenêtre, le plus fluide étant Flipbuffer(1) et surtout pas de Delay(1), autrement on perd cette belle sensation de fluidité malgrès les quelques drops.

http://stanz05.free.fr/IKp.zip bouton gauche fullscreen, droit: fenêtre (c'était packé avec kkrunchy, les antivirus n'aiment pas)
Dernière modification par Buckethead le dim. 22/mars/2009 16:38, modifié 4 fois.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

j'ai de nouveau lancé par curiosité la version plein écran avec la 4.30, et là c'est fluide( alors que tout à l'heure y avait une saccade avec les étoiles au bas de l'écran). C'est étrange cette histoire là. J'éteind la machine puis j'la rallume, 4.30, plein écran, F5 et c'est fluide. Bien, bien, bien, mmh... J'utilise plusieurs vieux logiciels, peut être que ce sont ces derniers, peu respectueux de winxp, qui sèment la panique dans nos registres ?...
Cpl.Bator a écrit :Désactivé la syncro vertical de vos cartes , ici c'est nickel , fluide. pas de saccade.
sans delay(1) le fps monte à 187, c'est dingue ! :)
en activant à nouveau la syncro, tout rentre dans l'ordre...

Par contre en mode fenêtre, y a aucun changement: avec ou sans syncro, c'est le même tarif...
Dernière modification par beauregard le dim. 22/mars/2009 16:58, modifié 4 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

le code ou j'obtiens la meilleur fluidité
c'est celui ci parceque je commence par un setframerate(50)
avant la boucle :) !!

bon en fait cette fonction sert a ça :lol:

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  )
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
; ***************************************************************

    SetFrameRate(50)
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
    temps=ElapsedMilliseconds()-go
    StartDrawing(ScreenOutput())
        DrawText(10,10,"Temps: "+Str(temps))
    StopDrawing()
    
    
  

    ExamineKeyboard()
    If  KeyboardPushed(#PB_Key_Escape)
        End
    EndIf
    
        FlipBuffers(#PB_Screen_WaitSynchronization )
        ClearScreen(0)
          Delay(2)
 
       
ForEver 
ps : CplBator : oui, peut etre, mais sur mon petit NC10 point de parametres de la sorte :lol:


@Dri :
oui, meme qu'un Clearscreen(X,Y,Larg,Haut) serai un vrais plus dans le purebasic !!

avec la possibilité de pouvoir agir sur l'ecran caché (ecran Logic) (celui que le Flipbuffer() affiche par un swap)

pour ça le Stos etait bien ou pouvait dessiner sur l'ecran logique (celui dont je parle)
l'ecran physic etait celui que l'utilisateur vois !

et l'ecran Back qui etait l'ecran du decor des sprites !!


en jonglant avec ces 3 ecrans, (avec un Swap ) on pouvais vraiment faire ce qu'on voulais :D

ps : on peut encore simuler ces ecrans avec les sprites() ou des images() ;)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Dr. Dri a écrit :Juste quelques remarques sur le post de djes

Pour moi des entiers de la taille de ton processeur sont forcément plus rapides (surtout si on fait intervenir des calculs un tant soit peu évolués) que des nombres réels.
C'est ce que je pensais aussi, tu te doutes bien... Jusqu'à à avoir fait quelques tests sur des calculs. Et là, et bien, je ne suis plus sûr de rien! Chez moi, très souvent les flottants sont largement au dessus des entiers.
Tout ça pour dire qu'on est plus à l'époque des démos techniques d'affichage d'effet plasma qu'on fait tourner sur un bon vieux DOS avec en sortie un VGA de 320x200...
Non, mais on peut encore faire des démos, même techniques! Rien n'empêche de dépasser les limites de Windows, en faisant une démo en ring 0 ;) (-hum- j'en serais bien incapable)
Un petit pavé dans la marre avec l'histoire du clearscreen. C'est cette commande qui bouffe le plus de ressources pour moi (en une seule fonction). Elle bouffe autant que FlipBuffers sans être réellement utile. Ce que je propose est très compliqué mais apporte de vrais gains de perfs... Ne redessiner que ce qui a changé d'une frame à l'autre!
Oui, c'est souvent bien, et dans le reste des cas, faire un gros sprite de la taille de l'écran... Ou alors tout redessiner.
Vous pensez que Windows redessine tout l'écran à chaque Frame pour un simple dépassement de souris ?
Ils en seraient bien capables! On a vu pire chez Microsoft! Et les débutants qui font cinquante instructions pour avoir moins à taper... (vu sur le forum anglais y'a pas longtemps, j'ai failli pleurer) :roll:
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Dobro a écrit :le code ou j'obtiens la meilleur fluidité
c'est celui ci parceque je commence par un setframerate(50)
avant la boucle :) !!

bon en fait cette fonction sert a ça :lol:




ps : CplBator : oui, peut etre, mais sur mon petit NC10 point de parametres de la sorte :lol:


@Dri :
oui, meme qu'un Clearscreen(X,Y,Larg,Haut) serai un vrais plus dans le purebasic !!

avec la possibilité de pouvoir agir sur l'ecran caché (ecran Logic) (celui que le Flipbuffer() affiche par un swap)

pour ça le Stos etait bien ou pouvait dessiner sur l'ecran logique (celui dont je parle)
l'ecran physic etait celui que l'utilisateur vois !

et l'ecran Back qui etait l'ecran du decor des sprites !!


en jonglant avec ces 3 ecrans, (avec un Swap ) on pouvais vraiment faire ce qu'on voulais :D

ps : on peut encore simuler ces ecrans avec les sprites() ou des images() ;)
tu devrai redémarer ta machine et tester avec le moins possible de logiciel( chuis sûr que ce sont mes vieux logiciels qui foutent la merde de temps à autres...)

je n'ai plus beaucoup de souvenir de l'amos, mais je vote pour ! :)
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

Houlala !

C'est "flippant " :lol: :lol: tout ça!
Je pense qu'il faudra faire un récapitulatif quand les mystères auront été résolus. :?
C'est quand même important ce PETIT détail.

Hasta la vista !
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Dobro a écrit :le code ou j'obtiens la meilleur fluidité
c'est celui ci parceque je commence par un setframerate(50)
avant la boucle :) !!
Pas fluide du tout chez moi. Le code le plus fluide est avec la smartsynchro : le haut est parfaitement fluide, en dessous, sur une centaine de pixels c'est hachuré (sur un écran CRT). On voit que la synchro est au timer, et que le double-buffer est swappé là!
Pour le refresh rate, il suffit qu'il soit égal à celui de mon écran pour que ça soit bien fluide. Avec le flipbuffers(1) ou d'autres fréquences, ce n'est jamais aussi fluide. Faudrait que j'essaye sur un écran plat.
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

pour résumer, c' est bill Gate et ces apotres qui foutent la merde!
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@Tonton

C'est une hypothèse! Qui vivra verra!

@Dobro

A peu de chose près, même résultat avec seulement... 8 sprites... :D

Edit: J'ai raréfié le Delay() pour qu'il ne passe la main toutes les 4 boucles... (Sur ma daube à 1 GHz, ça mouline à 88%)

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
   
        FlipBuffers()
        ;ClearScreen(0)
        Clic.I + 1
        Clic & 3
        If Clic = 0: Delay(1): EndIf
       
ForEver

:D
Dernière modification par Ollivier le dim. 22/mars/2009 17:45, modifié 1 fois.
Répondre