problème d'affichage

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Anonyme

Message 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
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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
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.
fly
Messages : 16
Inscription : sam. 10/févr./2007 14:13

Message 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.
Anonyme

Message par Anonyme »

Surement ta carte vidéo (mémoire partagée?)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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é.
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.
fly
Messages : 16
Inscription : sam. 10/févr./2007 14:13

Message 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.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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
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.
Anonyme

Message 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é. :?

@++
fly
Messages : 16
Inscription : sam. 10/févr./2007 14:13

Message 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
Anonyme

Message 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.
fly
Messages : 16
Inscription : sam. 10/févr./2007 14:13

Message 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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
fly
Messages : 16
Inscription : sam. 10/févr./2007 14:13

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
fly
Messages : 16
Inscription : sam. 10/févr./2007 14:13

Message par fly »

c'est parce que j'ai un ordinateur portable.

aurais tu une solution. c' est peut étre un mauvais parametre
Répondre