Performances : affichages sprites très lent [résolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
cdurand
Messages : 14
Inscription : dim. 12/févr./2012 11:38

Performances : affichages sprites très lent [résolu]

Message par cdurand »

Bonjour,
J'ai décidé récemment d'abandonner Visual Basic et mon choix s'est orienté vers PB car j'ai lu qu'il était simple et surtout plus rapide que VB pour la conception de jeux.
Or, je tape rapido un premier programme pour tester cette rapidité, et quel n'est pas mon étonnement de constater que je ne peux pas afficher plus d'une vingtaine de sprites à l'écran sans souffrir de ralentissement.
J'ai dû me tromper quelque part, car j'ai pu voir des démos de jeux bien plus complexes que ça.
Quelqu'un saurait-il m'expliquer où j'ai péché ? C'est que je débute dans ce langage.

Ma config :
Athlon XP 1800+
1.52 GHz
752 Mo de RAM
c'est pas une formule 1 mais quand même, 20 sprites ! :cry:

J'aimerais fournir un zip du prog mais je ne sais pas faire...

Code : Tout sélectionner

InitSprite()
UsePNGImageDecoder()
UseJPEGImageDecoder()

Enumeration
  #marche
  #attend
  #broute
  #arrivee
EndEnumeration

Structure S_vache
  spriteId.l
  type.a
  X.i
  Y.i
  L.i
  H.i
  dX.i
  dY.i
  Xi.i
  Yi.i
  Xd.i
  Yd.i
  dir.b
  pas.i
  pos.a
  spritePos.a
  state.a
EndStructure

Global nbVache.i
Global delayAnimVache.l

Declare animVache(*pVache.S_vache)

nbVache=30
NewList vache.S_vache()

OpenWindow(0,0,0,800,600,"Vaches")
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)

;LoadSprite(0,"pré1.jpg")

For i.i=0 To nbVache-1
  AddElement(vache())
  With vache()
    \type = Random(2)
    \spriteId = LoadSprite(#PB_Any,"vache0_256.png")
    TransparentSpriteColor(\spriteId,$FF00FF)
    \X=Random(800)
    \Y=Random(600)
    \L=SpriteWidth(\spriteId)/8
    \H=SpriteHeight(\spriteId)/9
    \state=#attend
    \dir=Random(7)
    \pos=Random(3)
    \pas=3+Random(5)
  EndWith
Next

delayAnimVache=ElapsedMilliseconds()

Repeat
  ; J'ai supprimé l'affichage du sprite fond par un simple ClearScreen pour voir, mais c'est pas mieux !
  ;DisplaySprite(0,0,0)
  ClearScreen(RGB(0,128,0)) 
  
  ; trace de deboggage, j'aimerais que ça ne dépasse pas 300 ms !
  SetWindowTitle(0, Str(ElapsedMilliseconds()-delayAnimVache))
  
  ;Je veux que les vaches s'animent toutes les 300 ms, pas moins
  If ElapsedMilliseconds()-delayAnimVache>300
    ForEach vache()
      animVache(@vache())
    Next
    delayAnimVache=ElapsedMilliseconds()
  EndIf
  
  ;affichage des sprites vaches
  ForEach vache()
    DisplayTransparentSprite(vache()\spriteId,vache()\X,vache()\Y)
  Next
  
  FlipBuffers()

Until WindowEvent() = #PB_Event_CloseWindow

Procedure animVache(*pVache.S_vache)
  With *pVache
    \pos = Mod(\pos+1,4)
    Select \state
      Case #attend
        If Random(100)>95 : \state=#broute : EndIf
      Case #broute
        If Random(100)>95 : \state=#attend : EndIf
    EndSelect
    \spritePos=\pos : If \spritepos=3 : \spritePos=1 : EndIf
    ClipSprite(\spriteId,\L*\dir,\H*(3*\state+\spritePos),\L,\H)
  EndWith
EndProcedure
Dernière modification par cdurand le dim. 12/févr./2012 21:07, modifié 1 fois.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Performances : affichages sprites très lent

Message par G-Rom »

Bonjour et bienvenu.

- founi les medias, ou fait en sorte que l'on ai besoin de rien pour tester ton code
- vire le debbugger pour les test de perf
- une animation toute les 300 ms, soit 3/4fps fera forcement "ramer"
cdurand
Messages : 14
Inscription : dim. 12/févr./2012 11:38

Re: Performances : affichages sprites très lent

Message par cdurand »

Comment puis-je fournir les images ? Dois-je passer par un site de stockage de données ? Lequel me conseilles-tu ?

Le debugger fait ramer l'execution, donc je peux difficilement tester la rapidité du prog avec. Je préfère les traces (ici le titre de la fenêtre me sert de trace).

Il me faut 400 ms pour animer 30 sprites, et 800 ms pour 100 sprites. C'est quand même pas normal, j'ai dû fauter. Et encore, j'ai viré l'affichage du sprite de fond !
Je veux bien que ça ralentisse, mais quand même, VB fait aussi bien !

Merci pour ta réponse.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Performances : affichages sprites très lent

Message par Ar-S »

salut,
tu peux créer une archive ZIP contenant le tout et l'heberger sur fileserve.com, dl.free.fr, rapidshare.com et bien d'autres...
Si ce ne sont que des images, passe par un hebergeur d'images comme http://imageshack.us/
Cordialement.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
cdurand
Messages : 14
Inscription : dim. 12/févr./2012 11:38

Re: Performances : affichages sprites très lent

Message par cdurand »

Merci pour ta réponse.

Premier essai avec le lien ci-dessous.
https://rapidshare.com/files/686861564/vaches.zip

J'ai d'ores et déjà remarqué que la taille de la planche du sprite avait une importance dans la rapidité d'affichage, même si on la clip avec clipSprite() aux même dimensions. C'est pas commode alors...
cdurand
Messages : 14
Inscription : dim. 12/févr./2012 11:38

Re: Performances : affichages sprites très lent

Message par cdurand »

C'est toujours moi...

Quand je regarde un tuto comme celui-ci
http://forum.games-creators.org/showpos ... ostcount=3

Je vois qu'on peut afficher constamment quelque chose comme 1600 sprites (pour les tuiles de la map de fond) sans ralentir le prog.
Alors que se passe-t-il dans mon code ?

Merci.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Performances : affichages sprites très lent

Message par comtois »

Inutile de charger ta planche de sprites pour chaque sprite, il suffit de la charger une seule fois, et ensuite de bien gérer ton ClipSprite et afficher tout de suite derrière le sprite correspondant.

Code : Tout sélectionner

InitSprite()
UsePNGImageDecoder()
UseJPEGImageDecoder()

Enumeration
  #marche
  #attend
  #broute
  #arrivee
EndEnumeration

Structure S_vache
  spriteId.l
  type.a
  X.i
  Y.i
  L.i
  H.i
  dX.i
  dY.i
  Xi.i
  Yi.i
  Xd.i
  Yd.i
  dir.b
  pas.i
  pos.a
  spritePos.a
  state.a
EndStructure

Global nbVache.i
Global delayAnimVache.l

Declare animVache(*pVache.S_vache)

nbVache=30
NewList vache.S_vache()

OpenWindow(0,0,0,800,600,"Vaches")
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)

LoadSprite(0,"pré1.jpg")
Vache = LoadSprite(#PB_Any,"vache0_256.png")

For i.i=0 To nbVache-1
  AddElement(vache())
  With vache()
    \type = Random(2)
    \spriteId = Vache
    TransparentSpriteColor(\spriteId,$FF00FF)
    \X=Random(800)
    \Y=Random(600)
    \L=SpriteWidth(\spriteId)/8
    \H=SpriteHeight(\spriteId)/9
    \state=#attend
    \dir=Random(7)
    \pos=Random(3)
    \pas=3+Random(5)
    ;ClipSprite(\spriteId,0,0,\L,\H)
  EndWith
Next

delayAnimVache=ElapsedMilliseconds()

Repeat
  
  Repeat 
    Event=WindowEvent()
    If Event = #PB_Event_CloseWindow
      Quit = 1
    EndIf  
  Until Event = 0
  
  ; trace de deboggage, j'aimerais que ça ne dépasse pas 300 ms !
  SetWindowTitle(0, Str(ElapsedMilliseconds()-delayAnimVache))
  
  ;Je veux que les vaches s'animent toutes les 300 ms, pas moins
  If ElapsedMilliseconds()-delayAnimVache>300
    DisplaySprite(0,0,0)
    ForEach vache()
      animVache(@vache())
    Next
    delayAnimVache=ElapsedMilliseconds()
  EndIf

  FlipBuffers()

Until quit

Procedure animVache(*pVache.S_vache)
  With *pVache
    ; ici c'est juste l'animation : changement de posture de la vache
    \pos = Mod(\pos+1,3)
    Select \state
      Case #attend
        If Random(100)>95 : \state=#broute : EndIf
      Case #broute
        If Random(100)>95 : \state=#attend : EndIf
    EndSelect
    
    \spritePos=\pos 
    If \spritepos=3 
      \spritePos=1 
    EndIf
    ClipSprite(\spriteId,\L*\dir,\H*(3*\state+\spritePos),\L,\H)
    DisplayTransparentSprite(\spriteId,\X,\Y)
  EndWith
EndProcedure
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Performances : affichages sprites très lent

Message par G-Rom »

Inutile de charger ta planche de sprites pour chaque sprite,
+1

- Tu devrais avoir une sorte de gestionnaire de ressource , qui charge tes sprites une seule fois , via une map par exemple :
NewMap Ressource.i()

Ressource("MESVACHE") = LoadSprite(#PB_Any ,"MonFichier.bmp")
Lors des appels pour afficher ton sprite , tu n'a qu'a faire appel à Ressource("MESVACHE") pour afficher ton sprite
tu peut même pousser le concept plus loin avec des structures :

Code : Tout sélectionner

Structure Ressource
  type.i
  id.i
EndStructure

#RessourceType_Sprite
#RessourceType_Son

NewMap  Ressources.Ressource()



Procedure LoadRessource(RessourceName.s, File.s, type.i)
  
  Select type
      
    Case #RessourceType_Sprite
      Ressources(RessourceName)\id     = LoadSprite(#PB_Any , File)
      Ressources(RessourceName)\type = #RessourceType_Sprite
      
    Case #RessourceType_Son
       Ressources(RessourceName)\id = LoadSound(#PB_Any,File)
        Ressources(RessourceName)\type = #RessourceType_Son
      
  EndSelect


EndProcedure


Macro GetRessource(name)
  Ressources(name)\id
EndMacro



LoadRessource("MaVache", "monFichier.bmp", #RessourceType_Sprite)

;...

DisplaySprite(  GetRessource(MaVache), x, y )
du coup ça t’éviterai un ClipSprite(\spriteId,\L*\dir,\H*(3*\state+\spritePos),\L,\H) dans la procedure "animVache(*pVache.S_vache)"
qui prends du temps pour rien !!
c'est en partie faux , enfin , c'est devenu faux , logiquement , il est plus intéressant pour la carte graphique de n'avoir qu'une seule unité de texture, que plusieurs petite unité de texture , cela s'appelle des métatextures. le clipping est en théorie une écriture dans 8 variables au max ( les coordonnée UV de chaque coin )
contrairement à un grabsprite() qui lui copie le tableau de pixel, ce n'est pas le cas du clipping.
cdurand
Messages : 14
Inscription : dim. 12/févr./2012 11:38

Re: Performances : affichages sprites très lent

Message par cdurand »

Waouh ! Moins de 10 ms par cycle ! :D Et avec un gros sprite de 800x600 en fond !
Effectivement, VB peut aller se rhabiller !

Mais je ne comprends pas trop pourquoi le fait de charger plusieurs sprites ralentissait l'affichage. Le lien m'échappe...
En gros, il faudra à chaque fois faire le clipSprite() juste avant le displaySprite(), on ne peut pas préparer le clip à l'avance pour l'afficher ensuite ?

En tout cas, merci pour cette intervention. Je vais donc continuer à essayer de programmer en PB et d'en comprendre toutes les subtilités.

A bientôt.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Performances : affichages sprites très lent

Message par blendman »

salut

Tu peux faire des choses vraiment très balèzes en purebasic, c'est quasiment aussi rapide que du c++. Par contre, il est clair qu'il faut bien réfléchir au code pour avoir un maximum de performance ;).

Voici le jeu sur lequel je bosse pour te donner une idée de ce que l'on peut faire en pure ;) : http://vimeo.com/35434282
Et ça tourne à 60fps en 1680*1050, avec des gros sprites, beaucoup de sprites (genre 1000) , et beaucoup d'alpha.

Par contre, je te conseille vraiment de te mettre au sprite3D, tu vas gagner en rapidité.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Performances : affichages sprites très lent

Message par Ar-S »

blendman a écrit :http://vimeo.com/35434282
ça pète sincèrement !
J'aime :
- Ton moteur de particules, les rendus sont top.
- Ton design, on te l'a déjà dit mais tu es vraiment doué
- Ton interface 2D

J'aime moins (c'est peut être du à la vidéo)
- Le scrolling que je trouve un peu "raide"
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
cdurand
Messages : 14
Inscription : dim. 12/févr./2012 11:38

Re: Performances : affichages sprites très lent

Message par cdurand »

C'est clair qu'avec mes 50 vaches j'ai encore des progrès à faire... :)

Au fait, comment on fait pour dire que mon problème est résolu ?
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: Performances : affichages sprites très lent

Message par case »

tu peux éditer le premier post de ce fil et changer le titre en ajoutant [résolu] par exemple ou ne rien faire, il n'est pas obligatoire de marquer un sujet comme résolu ;)
ImageImage
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Performances : affichages sprites très lent

Message par venom »

case a écrit :il n'est pas obligatoire de marquer un sujet comme résolu ;)
Non mais c'est mieux pour les recherches. :wink:





@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Performances : affichages sprites très lent

Message par Backup »

venom a écrit :
Non mais c'est mieux pour les recherches. :wink:





@++
+1
Répondre