Ou son passé les 2.5 Ghz ?!??

Sujets variés concernant le développement en PureBasic
Flastick
Messages : 21
Inscription : mer. 06/févr./2008 1:02

Ou son passé les 2.5 Ghz ?!??

Message par Flastick »

Bonjour à tous !!

Alors voilà, les premières neiges étant tombées ici, il m'a pris l'envie de créer un petit programme simple qui fait de la neige. (mis en cadeau en bas de post :D )

Je me suis amusé à le tester, SUR MON 733 Mhz. Avec 1000 flocons ça commence à ramer. Avant (600-700) ça va nickel.

Alors je me suis dit Génial !! Demain je le teste sur les ordis de l'école de 2.5 Ghz, et normalement, ces ordis executant 2.5/0.73 = 3.4 fois plus d'instructions, Je pourrais aller jusqu'à 3000 flocons avant de ramer..

Et ben niente..grande déception : avec 1000 flocons, ça rame autant que mon 733 Mhz.. Pire encore !! : L'écran plat leur fait des trainées moches, ce qui n'est pas le cas sur mon vieil écran cathodique trinitron !!!

Après je me suis dit : Oui mais il faut optimiser ça avec directX : un screen et des sprites..j'ai essayé et résultat: c'est encore pire !!!!

Donc me voila avec 3 questions pour vous :

1) Comment diable est-ce possible qu'un 2.5 Ghz rame autant que mon 733 Mhz ? Ou plutôt que mon 733 Mhz aille aussi vite que un 2.5 Ghz :-D

2) Est-ce possible d'optimiser mon programme pour mettre plus de flocons ? Si oui, comment ?

3) Une question plus simple : Comment optimiser la fonction Faire_Fond pour qu'elle ne prenne pas 5 secondes pour assombrir une image ?


Alors voici le programme

Attention : Il est un peu lent au démarrage ( Merci Monsieur Point() !!^^)

Code : Tout sélectionner


;Flocons, par Flavien, 2008
#Vrai = 1
#Faux = 0
#Fonce = 150 ;Noircissement

#Nbre_Flocons = 500
 
#Window_X_Ecartement = 200 
 
#Flocon_Taille_MAX = 3
#Flocon_Couleur_MAX = 100
#Flocon_Vitesse_MAX = 10
#Flocon_Vitesse_MIN = 5
#Flocon_Deviation_MAX = 2

;#Deviation_Temps = 10


#Image_Fond = 1
#Image = 2

#TMR_Flocon  = 1
#TMR_Vent = 2



#Vent_Temps_MAX = 10
#Vent_MAX = 1


#Win_Main = 1


Structure FloconStruct

  X_Pos.l
  Y_Pos.l
  
  Taille.b    ;rayon 
  Couleur.b   ;0 = tout blanc, 255 = tout noir
  
  Vitesse.b
  Temps.b
EndStructure 



Global NewList Flocon.FloconStruct()


ExamineDesktops()

Global Window_Width.l  = DesktopWidth(0) 
Global Window_Height.l = DesktopHeight(0) 

Global ImageFond = CreateImage(#Image_Fond,Window_Width,Window_Height) 
Global Image     = CreateImage(#Image,Window_Width,Window_Height) 

Global Vent.b ;Intensité du vent
Global Vent_Temps.b ;Durée de l'intensité actuelle du vent
Global Vent_Ecoule.b



Procedure Faire_Fond()
  H.l
  K.l
  J.l
  
  Rouge.c
  Vert.c
  Bleu.c
  hDC.l = StartDrawing(ImageOutput(#Image_Fond)) 
   BitBlt_(hDC,0,0,Window_Width,Window_Height,GetDC_(GetDesktopWindow_()),0,0,#SRCCOPY) 
   For H = 1 To Window_Width 
    For K = 1 To Window_Height 
    J = Point(H, K)
    Rouge = Red(J)
    If (Rouge - #Fonce >= 0) : Rouge - #Fonce
    Else : Rouge = 0 : EndIf
    
    Vert = Green(J)
    If (Vert - #Fonce >= 0) : Vert - #Fonce
    Else : Vert = 0 : EndIf
    
    Bleu = Blue(J)
    If (Bleu - #Fonce >= 0) : Bleu - #Fonce
    Else : Bleu = 0  : EndIf
       
    Plot(H, K, RGB(Rouge, Vert, Bleu))
    Next K
   Next H
StopDrawing() 
EndProcedure

Procedure CreerFlocon(Debut)
  AddElement(Flocon())
  Flocon()\X_Pos = Random(Window_Width + 2*#Window_X_Ecartement) - #Window_X_Ecartement
  If Debut = 0 :Flocon()\Y_Pos = -10
  Else : Flocon()\Y_Pos = - Random(Window_Height) : EndIf
  Flocon()\Taille = Random(#Flocon_Taille_MAX) + 1
  Flocon()\Couleur = Random(#Flocon_Couleur_MAX)
  Flocon()\Vitesse = Random(#Flocon_Vitesse_MAX - #Flocon_Vitesse_MIN) + #Flocon_Vitesse_MIN
  ;Flocon()\Temps = 0
EndProcedure



Procedure Demarrage()
  
  
  Faire_Fond()

  OpenWindow(#Win_Main,0,0,Window_Width,Window_Height,"",#WS_POPUP) 
   CreateGadgetList(WindowID(#Win_Main)) 
   ImageGadget(1,0,0,Window_Width,Window_Height,ImageFond) 
   DisableGadget(1,1)
   
   For I = 1 To #Nbre_Flocons
    CreerFlocon(#Vrai)
   Next I

 
   SetTimer_(WindowID(#Win_Main), #TMR_Flocon, 10,0)
   SetTimer_(WindowID(#Win_Main), #TMR_Vent, 700,0)

EndProcedure


Procedure ActualiserImage()

  I.c

 StartDrawing(ImageOutput(#Image)) 
  
    DrawImage(ImageFond,0,0) 
  
    ForEach Flocon()
      I = 255-Flocon()\Couleur
      
      Circle(Flocon()\X_Pos   ,Flocon()\Y_Pos   ,Flocon()\Taille    , RGB(I, I, I))
      
      Flocon()\X_Pos + Random(#Flocon_Deviation_MAX) - (#Flocon_Deviation_MAX/2) + Vent

      
      Flocon()\Y_Pos + Flocon()\Vitesse
      
      If Flocon()\Y_Pos > Window_Height
        DeleteElement(Flocon(),#Vrai)
        CreerFlocon(#Faux)
      EndIf
    Next

  StopDrawing() 
  
  SetGadgetState(1, Image)

EndProcedure


Procedure ActualiserVent()
  Vent_Ecoule + 1
  If Vent_Ecoule >= Vent_Temps
    ;Augmentation / Diminution 
    Vent_Temps = Random(#Vent_Temps_MAX)
    Vent + Random(2* #Vent_MAX) - #Vent_MAX
    Vent_Ecoule = 0
  EndIf
  
EndProcedure



Demarrage()

Repeat 
  Select WaitWindowEvent()
    Case #WM_TIMER
        Select EventwParam()
          Case #TMR_Flocon 
            ActualiserImage()
          Case #TMR_Vent
            ActualiserVent()

        EndSelect
        
        
     Case #WM_CHAR
      If EventwParam() = 27 : Break : EndIf
     Case #PB_Event_CloseWindow : Break

  EndSelect 
  

ForEver  

End


Merci pour vos réponses, et bon après - midi sous la neige !!

Ajouté par Dobro

édite ce message et regarde les balises employé pour mettre un code !!
([ code] et [/code ])
Merci :)
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Message par case »

questions 1 et 2 je n'y ai pas encore réfléchi :)

pour la question 3

l'idée est de copier l'image de fond dans une zone mémoire, de modifier la couleur des pixels puis de recopier la zone mémoire a sa place d'origine dans l'image...

car les opérations sur la mémoire sont beaucoup plus rapides qu'un point(x,y) et un plot (x,y)

j'ai donc modifier ton programme en fonction et effectivement il y a un sérieux gain de temps :)

Code : Tout sélectionner

;Flocons, par Flavien, 2008
#Vrai = 1
#Faux = 0
#Fonce = 150 ;Noircissement

#Nbre_Flocons = 500

#Window_X_Ecartement = 200

#Flocon_Taille_MAX = 3
#Flocon_Couleur_MAX = 100
#Flocon_Vitesse_MAX = 10
#Flocon_Vitesse_MIN = 5
#Flocon_Deviation_MAX = 2

;#Deviation_Temps = 10


#Image_Fond = 1
#Image = 2

#TMR_Flocon = 1
#TMR_Vent = 2



#Vent_Temps_MAX = 10
#Vent_MAX = 1


#Win_Main = 1


Structure FloconStruct

X_Pos.l
Y_Pos.l

Taille.b ;rayon
Couleur.b ;0 = tout blanc, 255 = tout noir

Vitesse.b
Temps.b
EndStructure



Global NewList Flocon.FloconStruct()


ExamineDesktops()

Global Window_Width.l = DesktopWidth(0)
Global Window_Height.l = DesktopHeight(0)

Global ImageFond = CreateImage(#Image_Fond,Window_Width,Window_Height)
Global Image = CreateImage(#Image,Window_Width,Window_Height)

Global Vent.b ;Intensité du vent
Global Vent_Temps.b ;Durée de l'intensité actuelle du vent
Global Vent_Ecoule.b






Procedure getmem(ID) ; copie une image dans la memoire pour y effectuer des operations avec peek et poke :) 
	ImageID=  ImageID(id)
	Hdc = CreateCompatibleDC_ ( GetDC_ ( ImageID ))
	If HDC
		bmi.BITMAPINFO
		bm.BITMAP
		GetObject_ ( ImageID , SizeOf(BITMAP), @bm.BITMAP)
		bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
		bmi\bmiheader\biWidth = bm\bmWidth
		bmi\bmiheader\biHeight = bm\bmHeight
		bmi\bmiheader\biPlanes = 1
		bmi\bmiheader\biBitCount = 32
		bmi\bmiheader\biCompression = #BI_RGB
		HList = AllocateMemory (bm\bmWidth*bm\bmHeight*4)
		GetDIBits_ (hDC, ImageID ,0,bm\bmHeight,HList,bmi, #DIB_RGB_COLORS ) 	
		ProcedureReturn HList
	EndIf	
EndProcedure
Procedure putmem(id,mem) ;copie une zone memoire dans une image existante
	ImageID=  ImageID(id)
	Hdc = CreateCompatibleDC_ ( GetDC_ ( ImageID ))
	If HDC
		bmi.BITMAPINFO
		bm.BITMAP
		GetObject_ ( ImageID , SizeOf(BITMAP), @bm.BITMAP)
		bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
		bmi\bmiheader\biWidth = bm\bmWidth
		bmi\bmiheader\biHeight = bm\bmHeight
		bmi\bmiheader\biPlanes = 1
		bmi\bmiheader\biBitCount = 32
		bmi\bmiheader\biCompression = #BI_RGB
		HList = AllocateMemory (bm\bmWidth*bm\bmHeight*4)
		SetDIBits_ (hDC, ImageID ,0,bm\bmHeight,mem,bmi, #DIB_RGB_COLORS ) 	
		
	EndIf
EndProcedure
Procedure Faire_Fond()
  hDC.l = StartDrawing(ImageOutput(#Image_Fond))
  BitBlt_(hDC,0,0,Window_Width,Window_Height,GetDC_(GetDesktopWindow_()),0,0,#SRCCOPY)
  StopDrawing()
  ;
  mempicture=getmem(#Image_Fond)  ; copie l'image de fond dans une zone memoire
  linel=4*ImageWidth(#Image_Fond) ; taille d'une ligne en memoire
  H.l
  K.l
  J.l
  Rouge.c
  Vert.c
  Bleu.c
  For H = 0 To Window_Width-1
    For K = 0 To Window_Height-1
    	j=PeekL(mempicture+(h*4+(k*linel))) ;lis la couleur du point actuel 
      Rouge = Red(J)
      If (Rouge - #Fonce >= 0) : Rouge - #Fonce
      Else : Rouge = 0 : EndIf
      
      Vert = Green(J)
      If (Vert - #Fonce >= 0) : Vert - #Fonce
      Else : Vert = 0 : EndIf
      
      Bleu = Blue(J)
      If (Bleu - #Fonce >= 0) : Bleu - #Fonce
      Else : Bleu = 0 : EndIf
      
      PokeL(mempicture+(h*4+(k*linel)),RGB(Rouge, Vert, Bleu)) ; ecrit la nouvelle couleur
    Next K
  Next H
  
  putmem(#Image_Fond,mempicture) ; recopie la zone memoire dans l'image
  FreeMemory(mempicture)         ; libere la memoire


EndProcedure

Procedure CreerFlocon(Debut)
AddElement(Flocon())
Flocon()\X_Pos = Random(Window_Width + 2*#Window_X_Ecartement) - #Window_X_Ecartement
If Debut = 0 :Flocon()\Y_Pos = -10
Else : Flocon()\Y_Pos = - Random(Window_Height) : EndIf
Flocon()\Taille = Random(#Flocon_Taille_MAX) + 1
Flocon()\Couleur = Random(#Flocon_Couleur_MAX)
Flocon()\Vitesse = Random(#Flocon_Vitesse_MAX - #Flocon_Vitesse_MIN) + #Flocon_Vitesse_MIN
;Flocon()\Temps = 0
EndProcedure



Procedure Demarrage()


Faire_Fond()

OpenWindow(#Win_Main,0,0,Window_Width,Window_Height,"",#WS_POPUP)
CreateGadgetList(WindowID(#Win_Main))
ImageGadget(1,0,0,Window_Width,Window_Height,ImageFond)
DisableGadget(1,1)

For I = 1 To #Nbre_Flocons
CreerFlocon(#Vrai)
Next I


SetTimer_(WindowID(#Win_Main), #TMR_Flocon, 10,0)
SetTimer_(WindowID(#Win_Main), #TMR_Vent, 700,0)

EndProcedure


Procedure ActualiserImage()

I.c

StartDrawing(ImageOutput(#Image))

DrawImage(ImageFond,0,0)

ForEach Flocon()
I = 255-Flocon()\Couleur

Circle(Flocon()\X_Pos ,Flocon()\Y_Pos ,Flocon()\Taille , RGB(I, I, I))

Flocon()\X_Pos + Random(#Flocon_Deviation_MAX) - (#Flocon_Deviation_MAX/2) + Vent


Flocon()\Y_Pos + Flocon()\Vitesse

If Flocon()\Y_Pos > Window_Height
DeleteElement(Flocon(),#Vrai)
CreerFlocon(#Faux)
EndIf
Next

StopDrawing()

SetGadgetState(1, Image)

EndProcedure


Procedure ActualiserVent()
Vent_Ecoule + 1
If Vent_Ecoule >= Vent_Temps
;Augmentation / Diminution
Vent_Temps = Random(#Vent_Temps_MAX)
Vent + Random(2* #Vent_MAX) - #Vent_MAX
Vent_Ecoule = 0
EndIf

EndProcedure




Demarrage()

Repeat
Select WaitWindowEvent()
Case #WM_TIMER
Select EventwParam()
Case #TMR_Flocon
ActualiserImage()
Case #TMR_Vent
ActualiserVent()

EndSelect


Case #WM_CHAR
If EventwParam() = 27 : Break : EndIf
Case #PB_Event_CloseWindow : Break

EndSelect


ForEver

End 

ImageImage
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Bravo FLAVIEN, j'adore cet effet, avec en transparence l'ecran d'origine 8)
J'avais encore jamais vu ça, super idée 8O

@Case
Excuse cette question que je n'ai pas osé te poser sur le forum US, mais il fait quoi le monsieur rouge au monsieur vert :roll:
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Message par case »

@kcc
je n'ai pas de réponses précises a cette question. ^ ^ tout est question de point de vue et de convictions personnelles sur les drm
ImageImage
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

il fouille pour retrouver les 2.5Ghz...
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

la fréquence de ton cpu n'est pas la seule chose a prendre en compte il y a la ram, la fréquence de celle-ci, l'OS, les programmes en taches de fonds, la bande passante du pipeline, la taille de cache ect ect donc difficile de répondre a ta première question !!! :lol:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

@Case
J'ai cru un instant qu'il lui faisait la methode de Heimlich, je cite : "La méthode d'Heimlich est une méthode de désobstruction des voies respiratoires sur l'adulte et l'enfant", mais apparement apres avoir regardé WIKI, j'ai vu que "j'mai trompé" mais qu'a moitié, c'est bien une histoire de désobstruction, mais pas comme je me l'imaginais :D
D'apres wiki DRM c'est "Digital Rights Management", ce doit etre une histoire de droit d'auteur.
Merci de ta reponse 8)
il fouille pour retrouver les 2.5Ghz...
Trop bon, encore "POUETTE" :lol: :lol:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Kwai chang caine a écrit :@Case
J'ai cru un instant qu'il lui faisait la methode de Heimlich, je cite : "La méthode d'Heimlich est une méthode de désobstruction des voies respiratoires sur l'adulte et l'enfant", mais apparement apres avoir regardé WIKI, j'ai vu que "j'mai trompé" mais qu'a moitié, c'est bien une histoire de désobstruction, mais pas comme je me l'imaginais :D
D'apres wiki DRM c'est "Digital Rights Management", ce doit etre une histoire de droit d'auteur.
Merci de ta reponse 8)
il fouille pour retrouver les 2.5Ghz...
Trop bon, encore "POUETTE" :lol: :lol:
Ou alors on ne respire pas tous par les même orifices :P
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

l'utilisation des Sprite 3D

aurai permis un code plus court
et beaucoup plus rapide !! :)

Mais c'est bien joli :)
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

A condition qu'il y ait une CG et pas une simple solution graphique intégrée (ce qu'on trouve souvent dans les écoles).
Flastick
Messages : 21
Inscription : mer. 06/févr./2008 1:02

Message par Flastick »

Ouais ok, en gros pas possible de faire beaucoup de neige sans une carte graphique d'enfer..!

Je sais bien que le clock du cpu n'est pas la seule chose à tenir en compte, mais normalement si ils font 2.5Ghz, alors ils doivent mettre un accès à la ram en conséquence, sinon il sert effectivement à rien..
enfin.. j'ai l'impression que les puissants processeurs sont mal gerés par windows, sauf pour les jeux ou les applications qui utilisent directx/opengl etc.. Car sinon mon programme devrait être bien plus fluide !
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Tu sais, parfois il est bon de revenir aux anciennes techniques. Si tu ne peux pas utiliser les sprites ou les sprites 3d (parce qu'ils se basent sur directx et qu'il n'est peut-être pas installé), alors essaye d'optimiser ton code. Ainsi, au lieu d'effacer l'écran à grands coup de drawimage, pourquoi n'effaces-tu pas seulement la portion qui a été écrasée par chaque flocon? (sauvegarde de la portion, dessin du flocon, restauration). De même, les plots et les circle sont très lents. Il y a sur le forum un paquet de codes avec des routines un peu plus rapides (avec les surfaces de mémoire).
Bon courage!
erhk
Messages : 30
Inscription : lun. 24/nov./2008 12:47

Message par erhk »

Flastick a écrit :Ouais ok, en gros pas possible de faire beaucoup de neige sans une carte graphique d'enfer..!
Je ne pense pas avoir une carte graphique d'enfer. Ca commence a se dégrader à 4500 flocons. C'est parfait à 4000. :D
Si tu veux continuer a travailler dessus : la neige pourrait-elle s'accumuler au bas de l'écran ? :)

Unika Linéane
P4 à 2,4 GHz
768 Mo de RAM
XP SP3
NVIDIA GeForce4 MX 420
Flastick
Messages : 21
Inscription : mer. 06/févr./2008 1:02

Message par Flastick »

Très bonne suggestion ! Mais je viens d'essayer, et il se trouve qu'il est mieux de rafraichir une grande image plutôt que de copier des milliers de petites.. Mais ça aurait été bien ; je n'y avais pas pensé
Répondre