EFFET D'EAU AVEC SCANLINE

Messages postés
390
Date d'inscription
vendredi 18 juin 2004
Statut
Membre
Dernière intervention
7 mai 2009
- - Dernière réponse : edisson81
Messages postés
5
Date d'inscription
mercredi 12 janvier 2005
Statut
Membre
Dernière intervention
22 juillet 2010
- 2 juil. 2007 à 11:28
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/43241-effet-d-eau-avec-scanline

Afficher la suite 
John Dogget
Messages postés
390
Date d'inscription
vendredi 18 juin 2004
Statut
Membre
Dernière intervention
7 mai 2009
-
J'ai l'impression que ça rame moins que la première version.
En tout cas, l'effet est bien reproduit, sans surcharge de codes :)

10/10
ça rame moins en effet !
Nais pour que ça aille encore plus vite, il faudrait penser à optimiser tes tableaux [0..0] car Delphi ralentit terriblement à calculer les index.

Exemple: cette ligne "im[i+(2*he-j-1)*wi]:=getpix(dx,dy);" prend un temps fou à elle seule !!!

C'est de ce côté là que tu peux gagner un max de vitesse...
Albedo039
Messages postés
31
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
31 janvier 2008
-
je n'ai pas vérifié en détail... mais il y a bcp de calculs répetitifs qui doivent pouvoir se rationaliser.

ex. 1:
# nw:=((vagues[cp+wn-wi-1]+
# vagues[cp+wn-wi ]+
# vagues[cp+wn-wi+1]+
# vagues[cp+wn -1]+
# vagues[cp+wn +1]+
# vagues[cp+wn+wi-1]+
# vagues[cp+wn+wi ]+
# vagues[cp+wn+wi+1]) div 4)-vagues[sp+wn];
=> il y a 8 fois le calcul cp+wn ou encore il y a 3 fois les calculs "cp+wn+wi" et "cp+wn-wi"
En utilisant des vars supplementaires, on devrait gagner un peu, non?

ex. 2:
les indexages à "img" sont assez fréquents.
Il est peut-être possible d'améliorer la vitesse.
Considérant "result:=im[x+(he-y)*wi];" (ligne 105):
=> créer un tableau suppl. dans lequel on a précalculé les combinaisons possibles c.a.d.
for x:=0 to wi do for y:=0 to he do TabSuppl[x,y]:=x+(he-y)*wi;
et après on obtient
result:=im[TabSuppl[x,y]];
ce qui économise 2 additions et une multipl.

et

"im[i+(2*he-j-1)*wi]:=getpix(dx,dy);"
peut être traité de la même manière :)


ex.3:
je n'ai tjs pas vérifié ;) le code assembleur produit, mais je propose que toooouuus les "*2" et les "div 4" etc... soit remplacés par
"*2" => shl 1
"div 4" => shr 2


Sinon: moi j'aime bien les vagues :))
cs_barbichette
Messages postés
243
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
15 juillet 2013
-
ben voilà, j'ai pris un peu de temps pour optimiser le tout.
Juste un truc, pour les "shr 2" à la place des "div 4", c'était pas toujours possible puisqu'on travail avec des nombres signés. En assembleur pas de souci puisqu'on peut faire des "sar 2". Mais en pascal, on n'est obligé de passer par des div.
De même pour les tableaux, j'ai rendu les calculs soit en dehors des crochets, soit en chageant le code et en faisant des additions.

Merci a tous
Albedo039
Messages postés
31
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
31 janvier 2008
-
Naalsoo :)) Sieht schon viel besser aus.

Habe noch "eine" Bitte (um Zeilen 427-432):
5 Mal "rect(1,1,wi-2,he-2)"
kann man doch irgendwie aufmotzen, oder?