modulographe

Partagez votre expérience de PureBasic avec les autres utilisateurs.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

modulographe

Message par comtois »

J'ai repris le code darkbasic d'Atreid et le titre (tant qu'à copier ,autant tout reprendre :) ) , pour l'adapter à PureBasic .
Bizarre ,j'ai l'impression que le plot() de PureBasic est plus lent que le dot de darkbasic ? j'ai ressorti ma boite de darkbasic pour comparer . Bon pour l'instant j'ai triché pour accélérer l'affichage sous purebasic , j'ai placé le flipbuffers après le next y , alors que dans la version originale il est placé avant .

Pressez la barre espace pour passer de la couleur au noir et blanc.

Code : Tout sélectionner

;Atreid
;http://forum.games-creators.org/showthread.php?t=290
Declare.f mod(a,b)
Declare Erreur(Message$)

;-Initialisation
ScreenWidth = 640
ScreenHeight = 480
If InitSprite() = 0 Or InitKeyboard()=0
  Erreur("Impossible d'initialiser DirectX 7 Ou plus")
ElseIf OpenScreen(ScreenWidth, ScreenHeight, 32, "demo") = 0
  Erreur("Impossible de créer la fenêtre")
EndIf

size = 120
CreateSprite(0,size * 4, size * 4)
NoirBlanc = 1
Repeat
  
  a = 2 * size 
  b = size * 0.6 + Random(a - (size * 0.6))
  c = size*Pow(0.6,2) + Random(b-(size*Pow(0.6,2)))
  d = size*Pow(0.6,3) + Random(c-(size*Pow(0.6,3)))
  e = size*Pow(0.6,4) + Random(d-(size*Pow(0.6,4)))
  
  milieux = ScreenWidth  / 2 - a
  milieuy = ScreenHeight / 2 - a
  
  Dim couleur(e)
  
  For t=1 To e
    couleur(t)=RGB(55+Random(200),  55+ Random(200),55+ Random(200))
  Next t
  
  For x = a To 0 Step -1
    For y = x To 0 Step -1
      
      var = mod(mod(mod(mod(mod(x * y, a), b), c), d), e)
      coul = couleur(var)
      
      StartDrawing(SpriteOutput(0))
      If NoirBlanc
        FrontColor(Green(coul), Green(coul), Green(coul))
      Else
        FrontColor(Red(coul), Green(coul), Blue(coul))
      EndIf
      Plot(y,x)
      Plot(x,y)
      Plot(y,2*a-x)
      Plot(x,2*a-y)
      Plot(2 * a - y ,2 * a - x)
      Plot(2 * a - x ,y)
      Plot(2 * a - x ,2 * a - y)
      Plot(2 * a - y ,x)
      StopDrawing()
    Next y
    
    DisplaySprite(0,milieux, milieuy)
    FlipBuffers()
    
    ExamineKeyboard()
    If KeyboardReleased(#PB_Key_Space  )
      NoirBlanc = 1 - NoirBlanc
      x=-1
      y=-1
    EndIf
    If KeyboardPushed(#PB_Key_Escape) 
      End
    EndIf
    
  Next x
  
Until  KeyboardPushed(#PB_Key_Escape) 

Procedure.f mod(a, b)
  c.f = a/1.0
  d.f = b/1.0
  e.l = a/b
  flo = (((c/d) - e) * b)+0.5
  
  ProcedureReturn flo
EndProcedure 
Procedure Erreur(Message$)
  MessageRequester( "Erreur" , Message$ , 0 )
  End
EndProcedure
Dernière modification par comtois le lun. 02/mai/2005 17:59, modifié 1 fois.
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

yo,
tu pensais que c 'était les 'plot' qui ralentissaient ton programme.
je pense que non, ce sont les autres calcules.
voici ton prog avec le 'plot' en assembleur.
ca va pas a peine plus vite.

Code : Tout sélectionner

;Atreid 
;http://forum.games-creators.org/showthread.php?t=290 
plotx=0 
  ploty=0 
  plotcoul=100 

Declare.f mod(a,b) 
Declare Erreur(Message$) 

;-Initialisation 
ScreenWidth = 640 
ScreenHeight = 480 
If InitSprite() = 0 Or InitKeyboard()=0 
  Erreur("Impossible d'initialiser DirectX 7 Ou plus") 
ElseIf OpenScreen(ScreenWidth, ScreenHeight, 32, "demo") = 0 
  Erreur("Impossible de créer la fenêtre") 
EndIf 
  

size = 160 
CreateSprite(0,(size * 4), (size * 4)) 

Repeat 
  
  a = (2 * size)-1  
  b = size * 0.6 + Random(a - (size * 0.6)) 
  c = size*Pow(0.6,2) + Random(b-(size*Pow(0.6,2))) 
  d = size*Pow(0.6,3) + Random(c-(size*Pow(0.6,3))) 
  e = size*Pow(0.6,4) + Random(d-(size*Pow(0.6,4))) 
  
  milieux = ScreenWidth  / 2 - a 
  milieuy = ScreenHeight / 2 - a 
  
  Dim couleur(e) 
  
  For t=1 To e 
    couleur(t)=RGB(55+Random(200),  55+ Random(200),55+ Random(200)) 
  Next t 
  
  For x = a To 0 Step -1 
    For y = x To 0 Step -1 
      
      var.f = mod(mod(mod(mod(mod(x * y, a), b), c), d), e) 
      coul = couleur(Int(var)) 
      
      StartDrawing(SpriteOutput(0)) 
      addecr = DrawingBuffer() 

        If NoirBlanc 
          FrontColor(Green(coul), Green(coul), Green(coul)) 
          plotcoul=FrontColor(Green(coul), Green(coul), Green(coul))
        Else 
          FrontColor(Red(coul), Green(coul), Blue(coul)) 
           plotcoul=FrontColor(Green(coul), Green(coul), Green(coul))
        EndIf 
        ;Plot(y,x) 
       ; Plot(x,y) 
       ; Plot(y,2*a-x) 
       ; Plot(x,2*a-y) 
       ; Plot(2 * a - y ,2 * a - x) 
        ;Plot(2 * a - x ,y) 
        ;Plot(2 * a - x ,2 * a - y) 
        ;Plot(2 * a - y ,x) 
        
      plotx=y
      ploty=x
      Gosub affplot  
      plotx=x
      ploty=y
      Gosub affplot  
      
      plotx=y
      ploty=2*a-x
      Gosub affplot  
      plotx=x
      ploty=2*a-y
      Gosub affplot  
    
      plotx=2 * a - y
      ploty=2 * a - x
      Gosub affplot  
      plotx=2 * a - x
      ploty=y
     Gosub affplot  
    
      plotx=2 * a - x
      ploty=2 * a - y
      Gosub affplot  
      plotx=2 * a - y
      ploty=x
      Gosub affplot  
      
    Next y 
    StopDrawing() 
    DisplaySprite(0,milieux, milieuy) 
    FlipBuffers() 
    
    ExamineKeyboard() 
    If KeyboardReleased(#PB_Key_Space  ) 
      NoirBlanc = 1 - NoirBlanc 
      x=-1 
      y=-1 
    EndIf 
    If KeyboardPushed(#PB_Key_Escape)  
      End 
    EndIf 

  Next x 
  
Until  KeyboardPushed(#PB_Key_Escape)  

Procedure.f mod(a, b) 
  c.f = a/1.0 
  d.f = b/1.0 
  flo.f = (((c/d) - Int((a/b))) * b)+0.5 

  ProcedureReturn flo 
EndProcedure  
Procedure Erreur(Message$) 
  MessageRequester( "Erreur" , Message$ , 0 ) 
  End 
EndProcedure

affplot: 
  MOV  eax,plotx 
  ROL  eax,2 
  MOV  edi,ploty 
  MOV  edx,edi
  ROL  edx,9
  ROL  edi,11
  ADD  eax,edx      
  ADD  edi,eax 
  ADD  edi,addecr 
  MOV  eax,plotcoul 
  MOV  [edi],eax 
 Return 
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Ben ce programme n'est visiblement pas fait pour être rapide, puisque l'on peut changer la valeur en cours de route, et que les startdrawing/stopdrawing sont dans la boucle.
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

la lenteur m 'etonnait.
ca viend en fait d 'un stardrawing et stoptrawing dans une boucle trop
frequante en effet.
une fois deplacé ca va bien plus vite.
;Atreid
;http://forum.games-creators.org/showthread.php?t=290
plotx=0
ploty=0
plotcoul=100

Declare.f mod(a,b)
Declare Erreur(Message$)

;-Initialisation
ScreenWidth = 640
ScreenHeight = 480
If InitSprite() = 0 Or InitKeyboard()=0
Erreur("Impossible d'initialiser DirectX 7 Ou plus")
ElseIf OpenScreen(ScreenWidth, ScreenHeight, 32, "demo") = 0
Erreur("Impossible de créer la fenêtre")
EndIf


size = 160
CreateSprite(0,(size * 4), (size * 4))

Repeat

a = (2 * size)-1
b = size * 0.6 + Random(a - (size * 0.6))
c = size*Pow(0.6,2) + Random(b-(size*Pow(0.6,2)))
d = size*Pow(0.6,3) + Random(c-(size*Pow(0.6,3)))
e = size*Pow(0.6,4) + Random(d-(size*Pow(0.6,4)))

milieux = ScreenWidth / 2 - a
milieuy = ScreenHeight / 2 - a

Dim couleur(e)

For t=1 To e
couleur(t)=RGB(55+Random(200), 55+ Random(200),55+ Random(200))
Next t
StartDrawing(SpriteOutput(0))
addecr = DrawingBuffer()


For x = a To 0 Step -1
For y = x To 0 Step -1

var.f = mod(mod(mod(mod(mod(x * y, a), b), c), d), e)
coul = couleur(Int(var))

If NoirBlanc
FrontColor(Green(coul), Green(coul), Green(coul))
plotcoul=FrontColor(Green(coul), Green(coul), Green(coul))
Else
FrontColor(Red(coul), Green(coul), Blue(coul))
plotcoul= FrontColor(Red(coul), Green(coul), Blue(coul))
EndIf
; Plot(y,x)
; Plot(x,y)
; Plot(y,2*a-x)
; Plot(x,2*a-y)
; Plot(2 * a - y ,2 * a - x)
; Plot(2 * a - x ,y)
; Plot(2 * a - x ,2 * a - y)
; Plot(2 * a - y ,x)
;Goto ty

plotx=y
ploty=x
Gosub affplot
plotx=x
ploty=y
Gosub affplot

plotx=y
ploty=2*a-x
Gosub affplot
plotx=x
ploty=2*a-y
Gosub affplot

plotx=2 * a - y
ploty=2 * a - x
Gosub affplot
plotx=2 * a - x
ploty=y
Gosub affplot

plotx=2 * a - x
ploty=2 * a - y
Gosub affplot
plotx=2 * a - y
ploty=x
Gosub affplot
ty:

Next y
; StopDrawing()
; DisplaySprite(0,milieux, milieuy)
; FlipBuffers()

ExamineKeyboard()
If KeyboardReleased(#PB_Key_Space )
NoirBlanc = 1 - NoirBlanc
x=-1
y=-1
EndIf
If KeyboardPushed(#PB_Key_Escape)
End
EndIf

Next x
StopDrawing()
DisplaySprite(0,milieux, milieuy)
FlipBuffers()


Until KeyboardPushed(#PB_Key_Escape)

Procedure.f mod(a, b)
c.f = a/1.0
d.f = b/1.0
flo.f = (((c/d) - Int((a/b))) * b)+0.5

ProcedureReturn flo
EndProcedure
Procedure Erreur(Message$)
MessageRequester( "Erreur" , Message$ , 0 )
End
EndProcedure

affplot:
MOV eax,plotx
ROL eax,2
MOV edi,ploty
MOV edx,edi
ROL edx,9
ROL edi,11
ADD eax,edx
ADD edi,eax
ADD edi,addecr
MOV eax,plotcoul
MOV [edi],eax
Return
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ben c'est fait exprès pour voir l'image se construire au fur et à mesure .
Dans ton exemple , on voit le résultat final , mais ce n'est pas l"effet recherché :)

dans la version darkbasic , Atreides met le sync( c'est l'équivalent de notre flipbuffer() ) avant le next y
moi j'ai triché , j'ai placé le flipbuffer() après :?

ceci dit merci pour la fonction plot en assembleur .

ici la version originale

Code : Tout sélectionner

sync on
sync rate 0
size = 75
dim couleur(0)
do
	a = size + rnd(size)
	b = size*0.6 + rnd(a-(size*0.6))
	c = size*0.6^2 + rnd(b-(size*0.6^2))
	d = size*0.6^3 + rnd(c-(size*0.6^3))
	e = size*0.6^4 + rnd(d-(size*0.6^4))
	milieux = screen width()/2 - a
	milieuy = screen height()/2 - a
	center text screen width()/2, screen height()/2+a+20,str$(a)+" "+str$(b)+" "+str$(c)+" "+str$(d)+" "+str$(e)
	undim couleur(0)
	dim couleur(e) as dword
	for t=1 to e
		couleur(t)=rgb(rnd(255), rnd(255), rnd(255))
	next t
	for x=a to 0 step -1
		for y=x to 0 step -1
			var = mod(mod(mod(mod(mod(x*y,a),b),  c),d),e)
			var = couleur(var)
			ink var,0
			dot y+milieux,x+milieuy
			dot x+milieux,y+milieuy
			dot y+milieux,2*a-x+milieuy
			dot x+milieux,2*a-y+milieuy
			dot 2*a-y+milieux,2*a-x+milieuy
			dot 2*a-x+milieux,y+milieuy
			dot 2*a-x+milieux,2*a-y+milieuy
			dot 2*a-y+milieux,x+milieuy
			sync
			if spacekey()=1
				x=-1
				y=-1
			endif
			if escapekey()=1 then end
		next y
	next x
	wait 1000
	cls
loop
function mod(a, b)
	c as float
	d as float
	flo as float
	c = a
	d = b
	flo = int((((c/d)-(a/b)) * b)+0.5)
endfunction flo
En recopiant l'originale ici , je viens de comprendre pourquoi c'était plus rapide , il a mis un sync rate 0 , donc pas de syncro , si je mets un Flipbuffer(0) , ça devient plus rapide ,enfin à l'oeil .
Ouf j'aime mieux ça , j'étais étonné de voir un code darkbasic tourner plus vite qu'un code PureBasic :lol:
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

regarde la position de ton StropDrawing dans ton premier code :roll: il faut le mettre avant le next et pas après, sinon, ça plante (essaie avec le debugger)

Sinon, c'est amusant.

Pour la lenteur, essaie de supprimer le Int dans ta procedure Mod
cette fonction est très lente
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

oups :oops:

C'est corrigé , merci :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

finalement j'ai viré la fonction mod , et utilisé la fonction de PureBasic ,ça donne de meilleurs résultats ,enfin il me semble :)
Et je n'ai gardé que le noir et blanc , j'aime mieux :)

Code : Tout sélectionner

;Code original par Atreides 
;http://forum.games-creators.org/showthread.php?t=290

Procedure Erreur(Message$)
  MessageRequester( "Erreur" , Message$ , 0 )
  End
EndProcedure

;-Initialisation
ScreenWidth = 640
ScreenHeight = 480
If InitSprite() = 0 Or InitKeyboard()=0 Or InitSprite3D()=0
  Erreur("Impossible d'initialiser DirectX 7 Ou plus")
ElseIf OpenScreen(ScreenWidth, ScreenHeight, 32, "demo") = 0
  Erreur("Impossible de créer la fenêtre")
EndIf

Global milieux.l, milieuy.l
size = 80
Delta = 0  
milieux = ScreenWidth  / 2 - 2 * size
milieuy = ScreenHeight / 2 - 2 * size

CreateSprite(0, size * 4 + 1, size * 4 + 1)

Procedure affiche()
  DisplaySprite(0,milieux, milieuy)
  FlipBuffers()
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Escape)
    End
  EndIf  
EndProcedure

Repeat
  
  a = 2 * size
  b = size * 0.6 + Random(a - (size * 0.6))
  c = size * Pow(0.6, 2) + Random(b - (size * Pow(0.6, 2)))
  d = size * Pow(0.6, 3) + Random(c - (size * Pow(0.6, 3)))
  e = size * Pow(0.6, 4) + Random(d - (size * Pow(0.6, 4)))
  
  Dim couleur(e)
  
  For t = 1 To e
    couleur(t) = RGB(Delta + Random(255 - Delta), Delta + Random(255 - Delta), Delta + Random(255 - Delta))
  Next t
  
  For x = a To 0 Step -1
    StartDrawing(SpriteOutput(0))
    For y = x To 0 Step -1
      var = (((((x*y % a) % b) % c) % d) % e)
      coul = couleur(var)
      FrontColor(Green(coul), Green(coul), Green(coul))
      ;M=(Red(coul)+Green(coul)+Blue(coul))/3
      ;FrontColor(M,M,M)
      Plot(y, x)
      Plot(x, y)
      Plot(y, 2 * a - x)
      Plot(x, 2 * a - y)
      Plot(2 * a - y , 2 * a - x)
      Plot(2 * a - x , y)
      Plot(2 * a - x , 2 * a - y)
      Plot(2 * a - y , x)
    Next y
    StopDrawing()
    affiche()
  Next x
  
  ;Efface
  For x = 0 To a 
    StartDrawing(SpriteOutput(0)) 
    For y = 0 To x 
      Plot(y, x, 0)
      Plot(x, y, 0)
      Plot(y, 2 * a - x, 0)
      Plot(x, 2 * a - y, 0)
      Plot(2 * a - y , 2 * a - x, 0)
      Plot(2 * a - x , y, 0)
      Plot(2 * a - x , 2 * a - y, 0)
      Plot(2 * a - y , x, 0)
    Next y
    StopDrawing()
    affiche()
  Next x
ForEver
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Excellent et fluide :D
Répondre