Performances : affichages sprites très lent [résolu]
Publié : dim. 12/févr./2012 11:49
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 !
J'aimerais fournir un zip du prog mais je ne sais pas faire...
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 !

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