violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 2010
-
11 mars 2007 à 11:42
guillaume1136
Messages postés21Date d'inscriptionjeudi 10 novembre 2005StatutMembreDernière intervention 3 juin 2008
-
15 nov. 2007 à 16:45
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
guillaume1136
Messages postés21Date d'inscriptionjeudi 10 novembre 2005StatutMembreDernière intervention 3 juin 2008 15 nov. 2007 à 16:45
Salut Proger,
merci pour le tuyaux :), je vais me pencher sur cette DLL.
C'est vrai qu'on ne pence pas assez souvent à regarder directement dans MSDN, c'est un bon reflex, j'y avai pas pencé. lol
Et enfin merci pour le site c'est se que je cherchais.
Proger
Messages postés248Date d'inscriptionvendredi 10 novembre 2000StatutMembreDernière intervention19 décembre 2008 15 nov. 2007 à 14:56
Salut Guillaume1136, je n'ai pas de réponses pour .NET ...
Cependant la fameuse DLL ddraw.dll est certainement la réponse (c'est celle utilisé pour l'affichage vidéo/film, ca ne passe donc pas par le GDI:Get/SetPixel... mais ca écrit pratiquement directement dans la mémoire vidéo)
En VB6 c'est pratiquement inutilisable hélas. Peut-etre qu'en .NET c'est plus simple.
Question source, cherche directement dans la msdn online de microsoft, ca m'étonnerai qu'un code source ai jamais été publié en vb.net
Enfin, si tu cherches d'autres formules a modéliser, intéresse toi aux attracteurs étranges (clifford, etc). Le site de Paul Bourke fourni les fonctions mathématiques "prete à l'emploi" pour la programmation.
guillaume1136
Messages postés21Date d'inscriptionjeudi 10 novembre 2005StatutMembreDernière intervention 3 juin 2008 4 oct. 2007 à 19:29
Je suis aussi sur un programme affichant des fractals de Mandelbrot et Julia mais en .NET, et je l'ai commencer dans le même esprit notamment celui de l'optimisation, pour ma part je ne suis pas encore aller fouiller dans le code ASM, mais j'ai déja banni le SetPixel qui afreusement lent pour utiliser une version réctifier de la source "GetPixel Très rapide" http://www.vbfrance.com/codes/GETPIXEL-TRES-RAPIDE_37145.aspx, problème : encore et toujour des bugs (problème du décalage des pixel résolue mais pas celui de "Memory Access Violation"), j'aimerai donc connaitre un moyen en VB.NET d'écrire et afficher directement à partir d'une même zone mémoire mémoire dans une fenètre.
De plus je suis preneur de tout algorithme different du mandelbrot classic, les maths et les complexes c'est pas mon fort et je suis imcapable de transformer une formule mathématique en algo. Or, sa cour pas la rue sur internet contrairement au formules.
Proger
Messages postés248Date d'inscriptionvendredi 10 novembre 2000StatutMembreDernière intervention19 décembre 2008 15 mars 2007 à 01:46
Quel soucis du détail, Renfield :) Tu m'incites à revoir tout le code !
Le coup du GetDC(0) je me suis toujours demandé comment le releaser, vu que ça n'utilise pas GetDesktopWindow() je n'ai pas les params pour ReleaseDC() !
Pour l'autre remarque, le gain semble minime vu les courtes boucles, j'ai donc pas fait l'astuce... Cependant comme t'as fait la remarque, voici le résultat décompilé : on remplace une suite d'instructions asm fst/fld/fmul/fld/fmul/faddp/fcomp par un fxch/fstp/fxch/fadd/fcomp (test du while, en gros). On économise effectivement deux instructions, qui sont les fmul. Même si les fmul sont rapide avec les cpu moderne, c'est l'économie de deux cycles qui est intéressant.
Tiens d'ailleur je viens de voir que le i=2*r*i+io c'est en fait a=r*i puis i=a+a+io ... pas fou le compilateur :D
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 14 mars 2007 à 13:19
pas mal !
code survollé...
fuite mémoire dans MatrixBuffer (StopRender)
GetDC(0)
non Releasé (ReleaseDC)
quelques cycles gagnés, en calculant r*r et i*i d'avance :
(j'ai également typé dx, dy, r, i & co)
Dim dx As Double, dy As Double
Dim r As Double, i As Double, ro As Double, io As Double, rt As Double
Dim r2 As Double, i2 As Double
Dim n As Long
Dim cl As Long
Dim xx As Long, yy As Long ', adv As Long
Tracing = True
'suite mandelbrot
'z.(n+1)=z.n^2-z.0
'avec z.n tel que (z=a+i*b, i*i=-1)
For xx = 1& To F_Width
'dans le cas d'un dessin tramé, il vaux mieux utiliser la formule de localisation x,y
'adv = adv + 1
'xx = adv Mod F_Width
'yy = Int(adv / F_Height)
ro = dx * xx + XMin
For yy = 1& To F_Height
io = dy * yy + YMin
i2 = io * io
r2 = ro * ro
'en jouant sur r, on peux changer la forme initiale de la fractale (ro + 1, - 1, etc)
r = ro
i = io
n = 0
Do While ((r2 + i2) < F_Eloigne) And (n < F_Iter)
rt = r2 - i2 + ro
i = 2 * r * i + io
r = rt
r2 = r * r
i2 = i * i
n = n + 1
Loop
FractBuf(xx, yy) = n
Next yy, xx
Tracing = False
End Sub
neamar
Messages postés26Date d'inscriptionvendredi 9 septembre 2005StatutMembreDernière intervention12 avril 2009 11 mars 2007 à 15:07
Après quelques test, programme vraiment génial !
Une interface graphique hyper rapide (jamais vu ca en Vb %-) , des fonctions pour les fractales optimisées...
Juste une remarque comme ca (parce que ca fait tâche sinon dans ce super code) : les deux variables de M_StartRender ne sont pas typées...
Et merci pour tout les commentaires !
neamar
Messages postés26Date d'inscriptionvendredi 9 septembre 2005StatutMembreDernière intervention12 avril 2009 11 mars 2007 à 14:14
Très utile, le module MatrixBuffer !
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 11 mars 2007 à 11:42
Je n'ai pas regardé le code, juste le résultat, mais c'est vraiment impressionant !
15 nov. 2007 à 16:45
merci pour le tuyaux :), je vais me pencher sur cette DLL.
C'est vrai qu'on ne pence pas assez souvent à regarder directement dans MSDN, c'est un bon reflex, j'y avai pas pencé. lol
Et enfin merci pour le site c'est se que je cherchais.
15 nov. 2007 à 14:56
Cependant la fameuse DLL ddraw.dll est certainement la réponse (c'est celle utilisé pour l'affichage vidéo/film, ca ne passe donc pas par le GDI:Get/SetPixel... mais ca écrit pratiquement directement dans la mémoire vidéo)
En VB6 c'est pratiquement inutilisable hélas. Peut-etre qu'en .NET c'est plus simple.
Question source, cherche directement dans la msdn online de microsoft, ca m'étonnerai qu'un code source ai jamais été publié en vb.net
Enfin, si tu cherches d'autres formules a modéliser, intéresse toi aux attracteurs étranges (clifford, etc). Le site de Paul Bourke fourni les fonctions mathématiques "prete à l'emploi" pour la programmation.
4 oct. 2007 à 19:29
De plus je suis preneur de tout algorithme different du mandelbrot classic, les maths et les complexes c'est pas mon fort et je suis imcapable de transformer une formule mathématique en algo. Or, sa cour pas la rue sur internet contrairement au formules.
15 mars 2007 à 01:46
Le coup du GetDC(0) je me suis toujours demandé comment le releaser, vu que ça n'utilise pas GetDesktopWindow() je n'ai pas les params pour ReleaseDC() !
Pour l'autre remarque, le gain semble minime vu les courtes boucles, j'ai donc pas fait l'astuce... Cependant comme t'as fait la remarque, voici le résultat décompilé : on remplace une suite d'instructions asm fst/fld/fmul/fld/fmul/faddp/fcomp par un fxch/fstp/fxch/fadd/fcomp (test du while, en gros). On économise effectivement deux instructions, qui sont les fmul. Même si les fmul sont rapide avec les cpu moderne, c'est l'économie de deux cycles qui est intéressant.
Tiens d'ailleur je viens de voir que le i=2*r*i+io c'est en fait a=r*i puis i=a+a+io ... pas fou le compilateur :D
14 mars 2007 à 13:19
code survollé...
fuite mémoire dans MatrixBuffer (StopRender)
GetDC(0)
non Releasé (ReleaseDC)
quelques cycles gagnés, en calculant r*r et i*i d'avance :
(j'ai également typé dx, dy, r, i & co)
Dim dx As Double, dy As Double
Dim r As Double, i As Double, ro As Double, io As Double, rt As Double
Dim r2 As Double, i2 As Double
Dim n As Long
Dim cl As Long
Dim xx As Long, yy As Long ', adv As Long
Tracing = True
dx = (XMax - XMin) / F_Width ' + XMin
dy = (YMax - YMin) / F_Height ' + YMin
ReDim FractBuf(1 To F_Width, 1 To F_Height)
'suite mandelbrot
'z.(n+1)=z.n^2-z.0
'avec z.n tel que (z=a+i*b, i*i=-1)
For xx = 1& To F_Width
'dans le cas d'un dessin tramé, il vaux mieux utiliser la formule de localisation x,y
'adv = adv + 1
'xx = adv Mod F_Width
'yy = Int(adv / F_Height)
ro = dx * xx + XMin
For yy = 1& To F_Height
io = dy * yy + YMin
i2 = io * io
r2 = ro * ro
'en jouant sur r, on peux changer la forme initiale de la fractale (ro + 1, - 1, etc)
r = ro
i = io
n = 0
Do While ((r2 + i2) < F_Eloigne) And (n < F_Iter)
rt = r2 - i2 + ro
i = 2 * r * i + io
r = rt
r2 = r * r
i2 = i * i
n = n + 1
Loop
FractBuf(xx, yy) = n
Next yy, xx
Tracing = False
End Sub
11 mars 2007 à 15:07
Une interface graphique hyper rapide (jamais vu ca en Vb %-) , des fonctions pour les fractales optimisées...
Juste une remarque comme ca (parce que ca fait tâche sinon dans ce super code) : les deux variables de M_StartRender ne sont pas typées...
Et merci pour tout les commentaires !
11 mars 2007 à 14:14
11 mars 2007 à 11:42
10/10
@+