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. :D

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 ! :D

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 ! :D

par contre en 1024x768
car la resolution de ton ecran est bizard pour mon system :D

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