Waiting for R3 ...
Bertrand30-Sep-2009/19:27:08+2:00
Juste pour montrer qu'on peut encore s'amuser avec Rebol 2.7 ( piqué à JustBasic et bien plus rapide en Rebol )
REBOL [title: "Cool fractals"]

;----------------------------
; constants and variables
;----------------------------
screen: 800x600
center: screen / 2

pset: does [
    ; -- set up some random colors
    col: to-tuple reduce [random 255 random 255 random 255]
    ; -- set up some random starting positions
    a: pick [0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1] random 11
    b: 0.9998
    c: 2 - (2 * a)
    dots: 12000
    x: j: 0
    y: 0.1 + random 12  
    ; -- calculate and draw the points
    loop dots [
        z: x
        x: b * y + j
        j: (a * x) + (c * (x ** 2) / (1 + (x ** 2)))
        y: j - z
        xy1: center + as-pair (x * 20) (y * 20)
        xy2: xy1 + 1x0
        append canvas/effect/draw reduce ['pen col 'line xy1 xy2]
    ]
]

;----------------------------
; building the GUI
;----------------------------
win: layout [
    origin 0x0
    canvas: box screen black effect [draw []] 
    at 700x570
    button "clear"
    rate 50 feel  [
        engage: func [face act evt] [
            case [
                act = 'down [canvas/effect/draw: copy []]  
                act = 'time [pset]
            ]
            show canvas
        ]
    ]
]

view win

... et pour faire vivre un peu le forum
Didec1-Oct-2009/10:28:50+2:00
Très sympa... et court !

Un détail, c'est que ça ralenti au fur et à mesure que le block 'draw grossi !

Donc voici une version optimisée : on sauve le dessin précédent dans une image qui est affichée sous le nouveau dessin.
Ainsi on ne fait un 'draw que des nouveaux points. Ca va plus vite !!

Autres petites optimisation :
- quelques parenthèses en moins pour optimiser l'évaluation.
- 'append remplacé par 'insert 'tail dans la boucle, plus rapide quand on le fait plein de fois ('append est une mezzanine).
- Insertion de la couleur une seule fois et non pas avec chaque point. Comme il y a 12000 point à chaque fois, ça fait quand même 23998 instructions de moins dans le block draw !

Enfin, quand j'observe la conso mémoire de ta version (Util. mémoire et Util. mémoire max dans le gestionnaire des tâches), elle grimpe continuellement jusqu'à 300Mo de RAM (en environ 30sec), puis il se produit des 'recycle qui permettent de ralentir la conso, mais elle ne s'arrête pas pour autant.
C'est compréhensible, puisqu'on ajoute 12000*5=60000 instructions dans le block draw à chaque refresh. Si on ne clear pas à un moment.... boum !

La version ci-dessous se limite à 21Mo, quel que soit la durée d'exécution.

Et en prime, j'ai rajouté un slider pour régler le nb de points calculés, histoire de faire varier le résultat.

REBOL [title: "Cool fractals"]

;----------------------------
; constants and variables
;----------------------------
screen: 800x600
center: screen / 2
dots: 2000 + 10000
; saved image of previous drawing
img: none

pset: does [
    ; -- save previous Drawing as image
	img: to-image canvas
	; -- removing previous drawing, but keeping 'image img in the block
	clear next next canvas/effect/draw
    ; -- set up some random colors
    col: to-tuple reduce [random 255 random 255 random 255]
    append canvas/effect/draw reduce ['pen col]
    ; -- set up some random starting positions
    a: pick [0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1] random 11
    b: 0.9998
    c: 2 - (2 * a)
    x: j: 0
    y: 0.1 + random 12  
    ; -- calculate and draw the points
    loop dots [
        z: x
        x: b * y + j
        j: a * x + (x ** 2 * c / (x ** 2 + 1))
        y: j - z
        xy1: center + as-pair x * 20 y * 20
        insert tail canvas/effect/draw reduce ['line xy1 xy1 + 1x0]
    ]
]

;----------------------------
; building the GUI
;----------------------------
win: layout [
    origin 0x0 across
    canvas: box screen black effect [draw [image img]] return
    at 20x570
    slider 300x16 with [data: dots / 20000] [
    	dots: max 10 to-integer 20000 * value
    	fdots/text: form dots
    	show fdots
    ]
    fdots: text white black bold form dots
    at 700x570
    button "clear"
    rate 50 feel  [
        engage: func [face act evt] [
            case [
                act = 'down [clear next next canvas/effect/draw clear img]
                act = 'time [pset]
            ]
            show canvas
        ]
    ]
]

view win
Bertrand1-Oct-2009/11:22:24+2:00
Merci beaucoup pour cette optimisation... Super !

Effectivement, lors de mes divers essais pour créer des animations graphiques avec Rebol, je suis souvent confronté à ces problèmes : ralentissement dû à l'agrandissement du bloc 'draw', puis problème de mémoire. C'est vrai aussi avec mes autres langages de prog., je ne suis qu'un codeur occasionnel et, bien souvent, pas mal de choses m'échappent... et j'ai tendance à programmer en Rebol comme on programme en Basic par exemple, alors que l'esprit est tout à fait différent (pourtant je connais un peu Logo, assez proche de Rebol).

D'autre part, je m'aperçois qu'une des meilleures manières d'en apprendre toujours plus en Rebol, c'est de partager ses scripts, aussi modestes soient-ils, et d'avoir ainsi l'occasion qu'ils soient corrigés ou améliorés par des Reboleurs confirmés.

Dans le cas présent j'en ai encore appris beaucoup, merci.

Pour conclure je dirais qu'en attendant Rebol 3, je n'hésite plus maintenant à utiliser Rebol 2.7 sans modération, j'ai encore bien des choses à découvrir et à assimiler. Ça ne pourra que mieux me préparer à la suite, enfin j'imagine ...
guest22-Oct-2009/20:25:04+2:00
Tiens j'avais manqué ça.

On peut faire plus rapide et que ça consomme encore moins de mémoire. Suffit de poker directement dans l'image au lieu d'utiliser Draw.

REBOL [title: "Cool fractals"]

;----------------------------
; constants and variables
;----------------------------
screen: 800x600
center: screen / 2
dots: 2000 + 10000
; saved image of previous drawing
img: make image! screen + 1x1

pset: does [
    ; -- set up some random colors
    col: random 255.255.255
    ; -- set up some random starting positions
    a: pick [0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1] random 11
    b: 0.9998
    c: 2 - (2 * a)
    x: j: 0
    y: 0.1 + random 12  
    ; -- calculate and draw the points
    loop dots [
        z: x
        x: b * y + j
        j: a * x + (x ** 2 * c / (x ** 2 + 1))
        y: j - z
    	if all [
			center/x > abs xx: x * 20
			center/y > abs yy: y * 20
    	][
    		xy: xx + center * 1x0 + (yy + center * 0x1)
    		poke img xy col
    	]
    ]
]

;----------------------------
; building the GUI
;----------------------------
win: layout [
    origin 0x0 across
    canvas: image img screen return 
    at 20x570
    slider 300x16 with [data: dots / 20000] [
    	dots: max 10 to-integer 20000 * value
    	fdots/text: form dots
    	show fdots
    ]
    fdots: text white black bold form dots
    at 700x570
    button "clear"
    rate 50 feel  [
        engage: func [face act evt] [
            case [
                act = 'down [img/rgb: black]
                act = 'time [pset]
            ]
            show canvas
        ]
    ]
]

view win


Autre petit truc en passant...
>>random 255.255.255
c'est un peu plus mieux que
>>to-tuple reduce [random 255 random 255 random 255]
Bertrand3-Oct-2009/16:36:22+2:00
Génial ! Merci ... Presque aussi rapide, et en tout cas plus coloré à mon goût, que la version que j'ai transcrite en FBSL ( http://www.fbsl.net/pmwiki/index.php ), réputé assez rapide en son genre.

Décidément, je crois que je vais finir par adopter définitivement Rebol. Il y a peu, j'hésitais encore entre NewLisp et Rebol (je dois limiter mes choix en matière de langage de prog./script, faute de temps). Mais avec NewLisp je n'arrive pas à ce genre de résultat, c'est lent et assez lourdingue à programmer comparé à Rebol... Et avec ce dernier il y a toujours le petit plus qui fait la différence ou bien diverses façons d'aborder le sujet.

Autre petit truc en passant...
>>random 255.255.255
c'est un peu plus mieux que
>>to-tuple reduce [random 255 random 255 random 255]

Ah oui, ça c'est le genre d'étourderie que je ne vois pas avant très longtemps, parfois jamais. Heureusement que les Reboleurs compétents et vigilants sont là !...

Le ...
if all [
			center/x > abs xx: x * 20
			center/y > abs yy: y * 20
    	][
    		xy: xx + center * 1x0 + (yy + center * 0x1)
    		poke img xy col
    	]

... n'est pas mal non plus !

Merci pour les corrections et améliorations.
guest25-Oct-2009/17:38:20+2:00
Version qui fonctionne avec R3.
(clicker pour nettoyer l'image)

C'est pas spécialement beaucoup plus rapide sur mon céléron.
Ca met 1/10 de seconde en gros pour recalculer 12000 points.
Par contre je vois bien le gain au niveau mémoire.
Avec R2 j'ai 14 Mo, avec R3 la moitié, soit 7 Mo.
Mais bon, faut avouer que la dans version R3 je n'utilise pas le VID. Donc forcement... c'est de la triche.

REBOL [title: "Cool fractals"]

;----------------------------
; constants and variables
;----------------------------
screen: 800x600
center: screen / 2
dots: 12000
img: make image! screen + 1x1

pset: does [
    ; -- set up some random colors
    col: random 255.255.255
    ; -- set up some random starting positions
    a: pick [0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1] random 11
    b: 0.9998
    c: 2 - (2 * a)
    x: j: 0
    y: 0.1 + random 12  
    ; -- calculate and draw the points
    loop dots [
        z: x
        x: b * y + j
        ;j: a * x + (x * x * c / (x * x + 1))
		j: x * c / (x * x + 1) + a * x
        y: j - z
    	all [
			center/y > abs yy: y * 20
			center/x > abs xx: x * 20
			poke img xx + center * 1x0 + (yy + center * 0x1) col
    	]
    ]
]

;----------------------------
; building the GUI
;----------------------------
screen: system/view/screen-gob
event-port: system/view/event-port: open [scheme: 'event]
event-port/awake: func [e][
	switch e/type [
		down [img/rgb: black]
		close [quit]
	]
	tail? screen
]

append screen win: append make gob! [
	image: img
	size: img/size
	offset: 50x50
] make gob! [
	size: 100x20
	text: [red ""]
]

show screen
forever [wait [screen 0.001] win/1/text/red: form dt [pset show win]]
shadwolf5-Oct-2009/18:38:12+2:00
c'est vrai que dans R3 VID s'appelle plus vid ... c'est quoi son petit nom déjà ?

Ceci dit c'est impressionnant de réduir de moitié la place mémoire occupée par le même script d'une version a l'autre...

Et après on dit que je suis un rabat joie quand je dis que le système de gestion de mémoire de rebol est hum .... chaotique ?
shadwolf5-Oct-2009/18:49:04+2:00
a quand le divx décodé point par point avec draw ...

bon sur mon pc (athlon x2 5000+ et DDR2 800MHz) je traite les image en 0.007 maxi ... très jolie programe.

je dirai que heu ... c'est un scandale tout ca 44% de mon cpu et 7.44 Mo de ram pris pour faire des petit point tout ca ... voila comme ca je suis rabat joie. Je me demande si c'est le genre de chose qui tournerai encore mieux sur mon dual core avec un systeme de thread ou pas ... ( on divise l'image en 2 et chaque core fait donc une moitier de boulot? je sais pas si les threads a la mode de rebol permettrai cela)...
shadwolf5-Oct-2009/18:52:33+2:00
sure un core i5 ce genre de programme en mono threading tirerait parti de la fonction turbo boost ( désactivation des core intul et auto overclock du core qui est entrain de déssiner les fractals a l'écran)
shadwolf5-Oct-2009/18:52:55+2:00
sur un core i5 ce genre de programme en mono threading tirerait parti de la fonction turbo boost ( désactivation des core intul et auto overclock du core qui est entrain de déssiner les fractals a l'écran)
guest25-Oct-2009/18:57:09+2:00
Non mais là c'est ma faute si ça prend 44% de ton cpu.
Il faut ajuster le WAIT en fonction de la machine.

Fait un wait [screen 0.013] au lieu de wait [screen 0.001]
Ca devrait régler ton problème et laisser le framerate autour de 50 images par seconde, largement suffisant.
guest25-Oct-2009/19:01:35+2:00
En même temps 50 images par seconde, c'est trop, t'as le temps de rien voir... Donc tu peux encore augmenter le délai du wait.
shadwolf5-Oct-2009/20:42:10+2:00
1 image par seconde ?
shadwolf5-Oct-2009/20:46:49+2:00
j'ai mis un wait 1 comme ca 'ai le temps d'apprecier le trip sous acide... Oups les jolies images fractal tout ca. Jeunesse dis non au LSD et oui au fractals :P
shadwolf5-Oct-2009/20:53:30+2:00
CPU entre 2 et 4% avec un wait de 1 seconde c'est beaucoup mieu en effet.

Ceci dit comme les pocesseurs multi core ont tendance a se généralisé partout tout ca et surtout dans les serveurs web je me demande si pour une fois le module de thread the rebol pouvais pas faire en sorte d'être dans la marche du temps...
avec un système qui allie a la fois async et thread dédier par CPU en espece de tambouille histoire que ce soit transparent pour le programmeur... si rebol detect un seul proc ou un seul coeur dans la machine alors le systeme de thread est converti en async. si on est dans une configuration multi core/proc alors rebol repartie joliement les thread entre les core/proc (normalement l'os est sensé le faire ... enfin windows est sensé faire plein plein de chose et en fait pas tant que ca donc...)
GreG6-Oct-2009/10:43:02+2:00
C'est beau! Felicitations!
eilijah30-Dec-2009/15:26:50+1:00
Pour utiliser le script sous rebol 3 il faut un plugin ? un equvalent de rebview ? J'ai la version alpha de rebol mais pas une version rebview3 , ou je peux me procurer le programme qui fait tourner ce script svp?
eilijah30-Dec-2009/15:29:13+1:00
Si vous avez de la doc sur ces fonction je prend aussi !

Y'a une fonction editer sur le forum ? je la trouve pas ):
shadwolf30-Dec-2009/16:37:53+1:00
Plein de réponses pour eilijah

Comment utiliser le script ?
Copie/colle le script cool fractal dans un editeur de texte de ton choix enregistre le fichier dans le même dossier que ton rebol 3 alpha (qui inclus un prototype de VID pas fini)

N'oublies pas de modifier le wait [screen 0.001] en fonction de ta machine

Comment obtennir rebol 3?

http://www.rebol.com/r3/downloads.html

mais evidement le prototype de VID n'est disponnible que pour les OS windows XP, vista, windows 7

Ou trouver la doc pour R3?

http://www.rebol.net moi je pars de la y a tout les liens ce que je ne trouve pas dans le wiki/doc je le cherche dans le blog, ce que je ne trouve ni dans l'un ni dans l'autre je le trouve en pausant la question sur Altme.
eilijah31-Dec-2009/3:28:42+1:00
Ok merci de tes reponses shadow, je suis sous linux ca explique pourquoi ca marchait pas (Si c'est pas intégré forcement :D). J'avais bien reussi a faire tournée les 2 premier avec rebol 2.7!
Comme j'ai dit dans l'autre post je vais donc faire tourner xp en vbox et je crois que je vais resté sous xp pour ce qui concerne rebol du coup :D
eilijah31-Dec-2009/4:29:12+1:00
en passant comment fait on pour obtenir l'acces a altme? Je me suis inscris sur une obscure mailling list mais je sais pas demander un acces :/

Tu connaitrais pas un tuto sinon pour se faire l amain sur VID?
Didec31-Dec-2009/11:16:52+1:00
Si tu t'es inscrit sur la mailing list, tu peux y faire la demande. Suffit de donner : nom, prénom, pseudo souhaité et une adresse email (pas en clair : genre "toto at wanadoo dot fr").

En tout cas bienvenue parmi nous Elijah.

Une petit correction par rapport à VID et Linux ou autre. Ce n'est pas une question de VID dispo ou pas, c'est une question de "View".
View est la couche graphique (bas niveau) de Rebol, VID est le dialecte de haut niveau permettant de construire des interfaces graphiques.
On peut utiliser View sans VID (qui n'est pas encore inclut dans R3, il faut taper "demo" pour charger le prototype de VID3). Le script de fractale que tu as vu dans un autre thread en est un exemple.

PS : pas (encore) de fonction "Editer" sur ce forum.
eilijah2-Jan-2010/6:05:44+1:00
mais je dois l'envoyé à lists[at]rebol[dot]com ? Parce que j'ai l'impréssion que c'est un robot :D (désolé c'est la premiere fois que j'utilise une mailing list -.-).

Donc View est bien intégré a R3 mais VID n'est pas encore dispo "par defaut"?
guest22-Jan-2010/10:38:49+1:00
Eilijah, Si tu y arrives pas, donne nous tes coordonnées ici et on fera passer l'info.
Il faut:
- une adresse e-mail valide (ne la donne pas en clair si possible)
- nom
- prénom
- pseudo souhaité (si trop bizarre, un autre pseudo te sera attribué)
eilijah3-Jan-2010/7:52:52+1:00
en fait je suis inscrits a la liste rebol mais je connais pas l'adresse de cette liste, si j'envois un message lists[at]rebol[dot]com il me répond un mail de robot du genre , commande non valide. M'enfin j'ai pas essayé rebol[at]rebol[dot]com -.- j'y vais de ce pas :D

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2