Page 1 sur 4

Plot VS Sprite VS Poke

Publié : dim. 10/sept./2006 16:56
par SPH
Salut,

Je post ici car j'incite tous ceux qui font du graphisme d'utiliser les plot plutot que les line et autre instruction graphique.

Mais je demande aussi au pro de PB si les plots sont finalement plus rapide que les sprites ? Je demande cela car je suis encore impressionné par leur rapidité...

Re: Plot VS sprite&autre

Publié : dim. 10/sept./2006 17:40
par Backup
SPH a écrit :Salut,

Je post ici car j'incite tous ceux qui font du graphisme d'utiliser les plot plutot que les line et autre instruction graphique.

Mais je demande aussi au pro de PB si les plots sont finalement plus rapide que les sprites ? Je demande cela car je suis encore impressionné par leur rapidité...
il est manifeste que t'a pas tous compris a purebasic !! .... :D

personellement j'utilise les lines si j'ai des ligne a dessiner, et des plots
pour d'autres besoin
quand au sprites , ce sont des Sprites , ils n'ont pas pour vocation a etre utiliser comme un plot !! (meme si l'on peut le faire) :D
mais bon un sprite de 1 pixel !! ??
de toute façon tu predessine dans ton sprite, en utilisant plot par exemple
cela reviens a faire du "precalculé" :D

Publié : dim. 10/sept./2006 17:49
par SPH
Hummmmmmmm, pas si sûr. Et je parlais de sprites avec zones transparentes que l'on peux faire avec des plots quand on ne les mets pas...
Attend, laisse moi finir mon pinguin elastique que je posterais dans le forum, puis je m'attaque a un sprite VS plots......

Publié : dim. 10/sept./2006 18:54
par Flype
je serais vraiment étonné que des plots soient plus rapides que des sprites dans une utilisation disons normales.

les sprites sont gérés en hardware par les cartes graphiques non ?

un sprite de 64x64 pixels représente quand meme 4096 pixels à dessiner point par point.

Publié : dim. 10/sept./2006 19:22
par SPH
Flype a écrit :les sprites sont gérés en hardware par les cartes graphiques non ?
Haaaaa, alors dans ce cas, les plot iront moins vite, en effet...
Mais laissez moi essayer un truc........

Publié : dim. 10/sept./2006 23:10
par SPH
Ok j'ai fais des tests et les sprites sont beaucoup plus rapide que les plots...
C'est seulement si un sprite ne contient que moins de 3 points que les plots equivalents sont plus rapides...

Publié : lun. 11/sept./2006 10:07
par Thyphoon
SPH a écrit :Ok j'ai fais des tests et les sprites sont beaucoup plus rapide que les plots...
C'est seulement si un sprite ne contient que moins de 3 points que les plots equivalents sont plus rapides...
si tu veux accelerer un plot Tu peux remplacer le plot part un poke avec juste un calcule de l'adresse. J'ai donné des exemples sur le forum...les poke sont même plus rapide que l'utilisation des pointeurs.

Publié : lun. 11/sept./2006 10:57
par SPH
ok, je note ca avec interet !

Publié : lun. 11/sept./2006 12:52
par Dr. Dri
Thyphoon a écrit :les poke sont même plus rapide que l'utilisation des pointeurs.
permet moi de douter ^^
je suis persuadé du contraire :P

montre moi ca si tu as un exemple
je suis curieux de voir un poke plus rapide

Dri

Publié : lun. 11/sept./2006 14:02
par djes

Publié : lun. 11/sept./2006 14:30
par SPH
Puisque nous sommes dans les TRUCS ET ASTUCES, quelle tete a le code qui bat un plot(0,0,rgb(255,255,255)) ??
Quelqu'un peux faire un resumé plzzzz ??

Publié : lun. 11/sept./2006 14:46
par Thyphoon
Poke vs Plot vs pointeur
http://www.purebasic.fr/french/viewtopi ... c&start=30

Je vous referais un code propre lorsque j'aurais le temps...mais je confirme en rapidité que ce soit la lecture ou pour l'écriture
le Pokel / Peekl est plus rapide que l'utilisation d'un pointeur qui est plus rapide que le Plot/Point

Prouvé moi le contraire... :P

Publié : lun. 11/sept./2006 17:45
par Anonyme
Prouvé moi le contraire... :P
Voila : :D

Le code si dessous effectue un test sur un écran de 800x600, il dessine 100x dessus avant de retourner le temps, j'ai virer les fonctions Flipbuffers()... donc on ne voit rien :D

Sur mon PC il y a une grosse différence entre le pointeur & le peek
en revanche sur un dual core, c'est quand meme le pointeur qui remporte de peu ( de l'ordre de qq ms...)

Code : Tout sélectionner

InitSprite()
OpenScreen(800,600,32,"PEEK AND POKE VS POINTER  :D ")

Structure Pixel 
  Pixel.l 
EndStructure : Global *Ptr.Pixel :  Global *Poke.l


Declare PointerDraw()
Declare PokeDraw()


PTR.l = PointerDraw()
PKE.l = PokeDraw()

CloseScreen()

MessageRequester("","POINTEUR = "+Str(PTR)+"ms"+Chr(10)+"POKE = "+Str(PKE)+"ms")


Procedure PointerDraw()
Protected DBuffer.l,DBufferP.l,PixelFormat.l,Pbyte.l 
Protected TA.l,TB.l

TA=ElapsedMilliseconds()
StartDrawing(ScreenOutput()) 

    For i = 1 To 100
    DBuffer      = DrawingBuffer() 
    DBufferP     = DrawingBufferPitch() 
    PixelFormat  = DrawingBufferPixelFormat() 

                      Select PixelFormat 
                            Case #PB_PixelFormat_8Bits         : PixelFormat=1 
                            Case #PB_PixelFormat_15Bits        : PixelFormat=2 
                            Case #PB_PixelFormat_16Bits        : PixelFormat=2 
                            Case #PB_PixelFormat_24Bits_RGB    : PixelFormat=3 
                            Case #PB_PixelFormat_24Bits_BGR    : PixelFormat=3 
                            Case #PB_PixelFormat_32Bits_RGB    : PixelFormat=4 
                            Case #PB_PixelFormat_32Bits_BGR    : PixelFormat=4 
                      EndSelect 
    
    For y = 0 To 600-1 
      *Ptr = DBuffer+DBufferP*y 
        For x = 0 To 800-1 
          *Ptr\Pixel = RGB(0,(y*100)/255,0)
          *Ptr + PixelFormat 
        Next 
    Next 
    Next i
StopDrawing() 
TB=ElapsedMilliseconds()
ProcedureReturn TB-TA
EndProcedure



Procedure PokeDraw()
Protected DBuffer.l,DBufferP.l,PixelFormat.l,Pbyte.l 
Protected TA.l,TB.l

TA=ElapsedMilliseconds()
StartDrawing(ScreenOutput()) 

    For i = 1 To 100
    DBuffer      = DrawingBuffer() 
    DBufferP     = DrawingBufferPitch() 
    PixelFormat  = DrawingBufferPixelFormat() 

                      Select PixelFormat 
                            Case #PB_PixelFormat_8Bits         : PixelFormat=1 
                            Case #PB_PixelFormat_15Bits        : PixelFormat=2 
                            Case #PB_PixelFormat_16Bits        : PixelFormat=2 
                            Case #PB_PixelFormat_24Bits_RGB    : PixelFormat=3 
                            Case #PB_PixelFormat_24Bits_BGR    : PixelFormat=3 
                            Case #PB_PixelFormat_32Bits_RGB    : PixelFormat=4 
                            Case #PB_PixelFormat_32Bits_BGR    : PixelFormat=4 
                      EndSelect 
    
    For y = 0 To 600-1 
      *Poke = DBuffer+DBufferP*y 
        For x = 0 To 800-1 
           PokeL(*Poke,RGB((y*100)/255,0,0))
          *Poke + PixelFormat 
        Next 
    Next 
    Next i

TB=ElapsedMilliseconds()
ProcedureReturn TB-TA
EndProcedure

Publié : lun. 11/sept./2006 18:30
par djes
Mes 2 cents ;)

Code : Tout sélectionner

;Original code by CplBator

;By Rescator
Procedure.l Ticks_HQ()
  Static maxfreq.q
  Protected t.q
  If maxfreq=0
    QueryPerformanceFrequency_(@maxfreq)
    maxfreq=maxfreq/1000
  EndIf
  QueryPerformanceCounter_(@t.q)
  ProcedureReturn t/maxfreq
EndProcedure


InitSprite()
OpenScreen(800,600,32,"PEEK AND POKE VS POINTER  :D ")

Structure Pixel
  Pixel.l
EndStructure : Global *Ptr.Pixel :  Global *Poke.l

Declare PointerDraw()
Declare PokeDraw()

PTR.l = PointerDraw()
PKE.l = PokeDraw()

CloseScreen()

MessageRequester("","POINTEUR = "+Str(PTR)+"ms"+Chr(10)+"POKE = "+Str(PKE)+"ms")


Procedure PointerDraw()
	Protected DBuffer.l,DBufferP.l,PixelFormat.l,Pbyte.l
	Protected TA.l,TB.l
	
	StartDrawing(ScreenOutput())
	
	DBuffer      = DrawingBuffer()
	DBufferP     = DrawingBufferPitch()
	PixelFormat  = DrawingBufferPixelFormat()
	
	Select PixelFormat
		Case #PB_PixelFormat_8Bits         : PixelFormat=1
		Case #PB_PixelFormat_15Bits        : PixelFormat=2
		Case #PB_PixelFormat_16Bits        : PixelFormat=2
		Case #PB_PixelFormat_24Bits_RGB    : PixelFormat=3
		Case #PB_PixelFormat_24Bits_BGR    : PixelFormat=3
		Case #PB_PixelFormat_32Bits_RGB    : PixelFormat=4
		Case #PB_PixelFormat_32Bits_BGR    : PixelFormat=4
	EndSelect

	TA=Ticks_HQ()
	For i = 1 To 300  
		*Ptr = DBuffer
		For y = 0 To 600-1
			v.l=RGB(0,y*i,0)
			For x = 0 To 800-1
				*Ptr\Pixel = v
				*Ptr + PixelFormat
			Next
		Next
		FlipBuffers()
	Next i
	TB=Ticks_HQ()

	StopDrawing()
	ProcedureReturn TB-TA

EndProcedure



Procedure PokeDraw()
	Protected DBuffer.l,DBufferP.l,PixelFormat.l,Pbyte.l
	Protected TA.l,TB.l
	
	StartDrawing(ScreenOutput())
	DBuffer      = DrawingBuffer()
	DBufferP     = DrawingBufferPitch()
	PixelFormat  = DrawingBufferPixelFormat()
	
	Select PixelFormat
		Case #PB_PixelFormat_8Bits         : PixelFormat=1
		Case #PB_PixelFormat_15Bits        : PixelFormat=2
		Case #PB_PixelFormat_16Bits        : PixelFormat=2
		Case #PB_PixelFormat_24Bits_RGB    : PixelFormat=3
		Case #PB_PixelFormat_24Bits_BGR    : PixelFormat=3
		Case #PB_PixelFormat_32Bits_RGB    : PixelFormat=4
		Case #PB_PixelFormat_32Bits_BGR    : PixelFormat=4
	EndSelect

	TA=Ticks_HQ()
	For i = 1 To 300
		*Poke = DBuffer
		For y = 0 To 600-1
			v.l=RGB(y*i,0,0)
			For x = 0 To 800-1
				PokeL(*Poke,v)
				*Poke + PixelFormat
			Next
		Next
		FlipBuffers()
	Next i
	TB=Ticks_HQ()

	StopDrawing()
	ProcedureReturn TB-TA
	
EndProcedure

Publié : lun. 11/sept./2006 18:37
par Anonyme
Ca rejoins exactement mon post, c'est kif-kif a 200 ou 500 (poke remporte de peu) Sauf sur le dual core, le pointeur est en tête. :?
Pas facile de nos jour d'optimisé :?