Page 2 sur 3
Publié : sam. 10/févr./2007 22:32
par Anonyme
@Comtois, non, je n'ai pas testé, ce n'est qu'une spéculation.
Mais il me parait logique que clipsprite soit plus lent que grabsprite, Enfin , je m'en vais faire un test.

Publié : sam. 10/févr./2007 22:44
par comtois
fly a écrit :Peut t'étre que mon ralentissement est normal et que purebasic n'est pas capable d'afficher 1000 sprite(environ 100*100 pixel) à un fps de 60.Mais cela m'étonne tout de même.
j'ai refais le test avec un sprite de 100*100, j'ai un ralentissement à partir de 1800 sprites , sinon le FPS ne bronche pas, il reste à 60.
Code : Tout sélectionner
InitSprite()
InitKeyboard()
InitMouse()
InitSound()
InitSprite3D()
OpenScreen(1280,1024,32,"essai")
UsePNGImageDecoder()
UseJPEGImageDecoder()
;LoadSprite(0,"data\porte etendart.png")
CreateSprite(0,100,100)
StartDrawing(SpriteOutput(0))
Circle(50,50,50,$123456)
StopDrawing()
Structure terrain_1
x.f
y.f
EndStructure
Global NewList terrain.terrain_1()
Declare principal()
Repeat
FlipBuffers()
ClearScreen(0)
ExamineKeyboard()
If Second < ElapsedMilliseconds()
Second = ElapsedMilliseconds()+1000
fps = Frame_Counter
Frame_Counter = 0
Else
Frame_Counter + 1
EndIf
; création des procedures
principal()
StartDrawing(ScreenOutput())
DrawText(0,0,"FPS : "+Str(fps) + " - Nb Sprites : " + Str(CountList(terrain())))
StopDrawing()
Until KeyboardPushed(#PB_Key_Escape)
Procedure principal()
If CountList(terrain())<2000
AddElement(terrain())
terrain()\x=Random(1280)
terrain()\y=Random(1024)
EndIf
ForEach terrain()
DisplayTransparentSprite(0,terrain()\x,terrain()\y)
Next
EndProcedure
Publié : sam. 10/févr./2007 22:46
par fly
Comtois, je viens de réessayer mon code avec les quelques modifications que tu as faites(créer un sprite au lieu dans charger un) mais j'ai toujours le même problème mon FPS tombe de 60 à 30. Je ne comprend vraiment pas.
Publié : sam. 10/févr./2007 22:48
par Anonyme
Surement ta carte vidéo (mémoire partagée?)
Publié : sam. 10/févr./2007 22:49
par comtois
ton FPS reste à 60 jusqu'à combien de sprites affichés ?
et ton débogueur tu as regardé s'il était activé ?
Si tu utilises une version de démo , il est toujours activé.
Publié : sam. 10/févr./2007 23:11
par fly
Oui j'ai une carte graphique avec 256mo de mémoire partager.
mon debogueur est désactiver
Mon fps passe de 60 à 30 à environ 1600 éléments quand j'utilise un sprite tout simple créer avec "createsprite", mais quand j'utile une image que j'ai chargée comme sprite mon fps passe de 60 à 30 à environ 600 éléments.
Publié : sam. 10/févr./2007 23:28
par comtois
Dans ce cas utilise les sprites 3D comme te le suggère Cpl.Bator
Avec des sprites 3D je peux afficher jusqu'à 3600 sprites sans que le FPS bouge.
Code : Tout sélectionner
InitSprite()
InitKeyboard()
InitMouse()
InitSound()
InitSprite3D()
OpenScreen(1280,1024,32,"essai")
UsePNGImageDecoder()
UseJPEGImageDecoder()
;LoadSprite(0,"data\porte etendart.png")
CreateSprite(0,100,100,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(0))
Circle(50,50,50,$123456)
StopDrawing()
CreateSprite3D(0,0)
Structure terrain_1
x.f
y.f
EndStructure
Global NewList terrain.terrain_1()
Declare principal()
Repeat
FlipBuffers()
ClearScreen(0)
ExamineKeyboard()
If Second < ElapsedMilliseconds()
Second = ElapsedMilliseconds()+1000
fps = Frame_Counter
Frame_Counter = 0
Else
Frame_Counter + 1
EndIf
; création des procedures
principal()
StartDrawing(ScreenOutput())
DrawText(0,0,"FPS : "+Str(fps) + " - Nb Sprites : " + Str(CountList(terrain())))
StopDrawing()
Until KeyboardPushed(#PB_Key_Escape)
Procedure principal()
If CountList(terrain())<4000
AddElement(terrain())
terrain()\x=Random(1280)
terrain()\y=Random(1024)
EndIf
Start3D()
ForEach terrain()
DisplaySprite3D(0,terrain()\x,terrain()\y)
Next
Stop3D()
EndProcedure
Publié : sam. 10/févr./2007 23:35
par Anonyme
Oui j'ai une carte graphique avec 256mo de mémoire partager.
mon debogueur est désactiver
Aïe, rien que pour WinXP tes 256mo y passe...
donc pas grand chose pour la vidéo.
Sprite3D ou pas , tu auras toujours des difficultés dans ce domaine, le code ne peut rien dans ton cas. Désolé.
@++
Publié : sam. 10/févr./2007 23:56
par fly
je viens d'essayer avec les sprite 3d , le ralentissement arrive au même moment.
Je pense pas que ma carte graphique soit merdique non plus car elle support des jeux récents (ex: company of heros).
Existe t'il une methode plus optimisée pour ce genre de programme
Publié : dim. 11/févr./2007 0:04
par Anonyme
Ce n'est pas question de jeux recent ou pas, 2d ou 3d ne change rien au programme, la question est là mémoire, si tu n'a plus de place sur ta ram, logiquement la Ram est remplacé par une partie du disque dur, et les accès disques sont plus long que ceux de la ram, d'ou le ralentissement.
Essaye sur un pc moins puissant , mais avec une carte vidéo avec sa propre mémoire.
Publié : dim. 11/févr./2007 0:37
par fly
Même si j'ai que 256 mo de memoire partager pour la carte graphique j'ai quand même 1 go de mémoire vive. Ca doit suffir normalement.
Publié : dim. 11/févr./2007 0:40
par Backup
[quote="comtois"]Dans ce cas utilise les sprites 3D comme te le suggère Cpl.Bator
Avec des sprites 3D je peux afficher jusqu'à 3600 sprites sans que le FPS bouge.
a 4000 sprites je suis a fps 63 qui ne bouge pas !

Publié : dim. 11/févr./2007 0:57
par fly
toujours le même probleme
Dobro, pourrais tu essayer mon code avec comme sprite une image png qui fais environ 100*100 pour voir si c'est le code ou mon ordi qui deconne.
merci d'avance
Code : Tout sélectionner
InitSprite()
InitKeyboard()
InitMouse()
InitSound()
InitSprite3D()
OpenScreen(1440,900,32,"essai")
UsePNGImageDecoder()
UseJPEGImageDecoder()
LoadSprite(0,"porte etendart.png",#PB_Sprite_Texture)
CreateSprite3D(0,0)
Structure terrain_1
x.f
y.f
EndStructure
Global NewList terrain.terrain_1()
Global terrain.terrain_1
Declare principal()
Repeat
FlipBuffers()
ClearScreen(0)
ExamineKeyboard()
If Second < ElapsedMilliseconds()
Second = ElapsedMilliseconds()+1000
fps = Frame_Counter
Frame_Counter = 0
Else
Frame_Counter + 1
EndIf
principal()
StartDrawing(ScreenOutput())
DrawText(0,0,"FPS : "+Str(fps))
DrawText(200,0,StrF(terrain\x))
StopDrawing()
; création des procedures
Until KeyboardPushed(#PB_Key_Escape)
Procedure principal()
If CountList(terrain())<2000
terrain\x=terrain\x+1
AddElement(terrain())
terrain()\x=Random(1440)
terrain()\y=Random(900)
EndIf
Start3D()
ForEach terrain()
DisplaySprite3D(0,terrain()\x,terrain()\y)
Next
Stop3D()
EndProcedure
Publié : dim. 11/févr./2007 1:58
par Backup
voila 2000 sprite fps entre 141 et 144 !
par contre en 1024x768
car la resolution de ton ecran est bizard pour mon system

Publié : dim. 11/févr./2007 2:12
par fly
c'est parce que j'ai un ordinateur portable.
aurais tu une solution. c' est peut étre un mauvais parametre