DÉGRADÉ ANINÉ ! RECTANGULAIRE, POLAIRE, OU LINÉAIRE. MULTI SPEED, ET PLUS FLUIDE
cs_koko
Messages postés654Date d'inscriptionlundi 14 janvier 2002StatutMembreDernière intervention20 février 2005
-
20 févr. 2005 à 10:37
cs_Anthomicro
Messages postés9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 2007
-
19 avril 2006 à 21:10
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_Anthomicro
Messages postés9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 19 avril 2006 à 21:10
Ah ? vl'a qu'il cherche toutes les sources de stepibou pour se rattraper ^^
kegi
Messages postés164Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention25 août 2008 19 avril 2006 à 21:05
Très bien. 9/10
Cordialement,
Kevin (kegi@hotmail.com)
arnal69130
Messages postés445Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention22 mars 20072 23 mars 2005 à 09:45
N'hésitez pas à essayer d'accélérez un peu le timer, dans la fonction javascript :
function wait(temprestant,act){
...
setTimeout(act, 10); //par exemple
}
arnal69130
Messages postés445Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention22 mars 20072 21 mars 2005 à 18:11
Après l'avoir testé, je confirme qu'en créant les images dans des fichiers png ce script gagne beaucoup de fluidité, même avec des grandes dimensions !
Stepibou, je t'envoie ce que j'ai fait.
arnal69130
Messages postés445Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention22 mars 20072 22 févr. 2005 à 16:56
Salut,
Bien trouvé le dégradé en polaire et l'animation.
Attention, il n'y a pas de 's' dans getElementById('texte1'). En effet, il n'y a qu'un seul élément pour un seul id ;o)
Sinon dans les fonctions js de index.php, je n'ai pas compris pourquoi tu as mis des '[0]' derrière les 'oSelects' ? Chez moi il faut que je les enlève pour que ça fonctionne.
Pour gagner en fluidité, peut-être que tu peux essayer de créer toutes les images qui vont servir pour un dégradé animé, par exemple en png, et ensuite tu les appelles en js. Ainsi tu évites de re-créer les mêmes images à chaque passage de la boucle. C'est juste une idée comme ça ;o)
A+
Arnaud
stepibou
Messages postés112Date d'inscriptionjeudi 11 mars 2004StatutMembreDernière intervention11 octobre 2006 22 févr. 2005 à 16:03
C'est cool les gars.
merci coucou747 pour ton aide :
je n'ai pas les ouvertures fermetures de tags php ?!?
j'ai le report d'erreur pourtant sur on, d'ou ca viens?
Pour zoukozouko, ca ne peux pas etre lent :
c plus ou moins fluide, ou carement ca n'affiche pas
si c'est trop relou.
Pour Konqueror et tout le tintoin, je l'avoue, j'y connait rien, tout le js qui y a ici, a ete adapté à l'arache d'autres sources. désolé, demerdez vous!...
mais pour me faire pardonner, les ptits lou, je vous
prépare un petit truc sympas, et qui à priori ne sera pas
une locomotive à vapeur. ;-)}
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 22 févr. 2005 à 01:39
c'est que la diférence ne doit pas etre vraiment notable...
cs_Anthomicro
Messages postés9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 22 févr. 2005 à 00:55
"En tout cas, c'est sûr que c'est plus clair comme tu l'as codé (mais moins efficace je crois, à vérifier)."
J'ai déjà fait des tests il y a longtemps sur 10000 itérations, verdict : temps de génération identique.
a +
zoukozouko
Messages postés148Date d'inscriptiondimanche 25 janvier 2004StatutMembreDernière intervention21 janvier 2009 22 févr. 2005 à 00:54
OK, merci.
c'est vrai que sur 1000000 d'opération à la seconde, le test de la présence d'une accolade ne ralenti pas beaucoup, mais forcément, le fait de rajouter des accolades inutiles oblige à empiler, dépiler, et à faire un test en plus s'il ne rentre pas dans le if (pour savoir à quel moment il doit passer en séquence).
tu devrais essayer avec une plus lonugue séquence de code.
Le pb de ton test c'est qu'il n'y a pas de séquence après le if
essaie un code du type :
{
$k = 0;
for ($i=0; $i<100; $i++)
{
if ($i%10)
{
if ($i%2) {$k++;}
else {$k += 2;}
}
else
{
if ($i%2) {$k++;}
else {$k += 2;}
}
if ($i%3) {$k++;}
else {$k += 3;}
$k--;
}
contre:
{
$k = 0;
for ($i=0; $i<100; $i++)
{
if ($i%10)
if ($i%2) $k++;
else $k += 2;
else
if ($i%2) $k++;
else $k += 2;
if ($i%3) $k++;
else $k += 3;
$k--;
}
Je ne mets jamais d'accolade s'il n'y a qu'une instruction apres le if, et ceci pour des raisons de clarté(j'arrive d'autant mieu à lire un code qu'il y a peu d'accolades...
Et puis dès que je vois une acolade, je cherche la deuxième instruction...
Bon toutes facons, c'est sûrement une habitude personnelle.
Je posait la question surtout pour me rassurer au niveau du temps d'exécution.
coucou747 : tu n'as pas fait de test pour le swith avec un seul case, comparé au if, tu en penses quoi?
zoukozouko
Messages postés148Date d'inscriptiondimanche 25 janvier 2004StatutMembreDernière intervention21 janvier 2009 22 févr. 2005 à 00:27
aussi, j'ai essayé de tout tester,j'ai peut etre oublié qqchose, mais je n'ai pas remarqué de probleme de temps d'execution.
en tout cas pour les images 320 x 240 (par défault), limage est affichée en moin d'une seconde (vu les comentaires je m'attendait à bien pire)
quelqu'un peut-il me dire dans quel cas l'exécution est lente?
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 22 févr. 2005 à 00:25
euh...
tout dépends de ce que tu apelles se tromper...
ça surcharge effectivement la pile (teste sur une calto en basic un truc style :
:lbl0
:getkey->a
:if a=0:then:goto 0:end
:goto 0
si tu n'apuis pas sur une touche, en peu de temps tu vas voir erreur memory... car la pile aura été remplie...
pour les acolades, ça ne joue pas un grand role, c'est pas un problème grave, mais l'utilisation des gotos dans nimporte quel langage est vivement déconseillée pour cette raison...
Maintenant, faudrait que j'éteigne mon serveur X, mon serveur apache, mysql ... et que je fasse des benchs... la, c'est vraiment mitigé... les résultats sont vraiment trops proches ou alors s'ingversent tout le temps... je ne peux rien conclure, maic c'est vrai que pour la théorie, tu as raison... maintenant, c'est tellement petit comme optimisation... celle la, moi je ne la fais pas toujours pour laisser plus de claretée...
<?php
function compare($tab,$calc)
{
$temps=array();
$j=0;
echo 'code:, temps d\'exécution pour '.$calc.' calculs, ';
foreach($tab as $code){
$start=microtime();
eval('for ($i=0;$i<10000;$i++)'.$code);
$end=microtime();
echo '----
'.$code.', '.($end-$start).', ';
$j++;
}
echo '
';
}
compare(array('if ($a){$a++;}else{$a=1;}','if ($a)$a++;else $a=1;'),100000);
?>
chez moi, rien de concluant...
zoukozouko
Messages postés148Date d'inscriptiondimanche 25 janvier 2004StatutMembreDernière intervention21 janvier 2009 22 févr. 2005 à 00:12
Je trouve la source tres interessante est bien commentée.
J'ai deux questions :
une au niveau de la prog : pourquoi mets-tu des accolades après tes if même s'il n'y a qu'une intruction?
(prévenez moi si je me trompe) mais il me semble que le php n'étant pas compilé, l'utilisation des accolades surcharge la pile d'execution : au lieu de continuer l'exécution du code après le if, (avec ton dode, ) il faut vérifier qu'il n'y a plus d'instructions et qu'on a bien une accolade fermante. En tout cas, c'est sûr que c'est plus clair comme tu l'as codé (mais moins efficace je crois, à vérifier).
2ème question: rectangle.php :
switch ($sens)
{
case $cas :
if ( $i < $j*$t/8 ) {
$k = -$i+$j*$t/8;
} else {
$k = $i-$j*$t/8;
} break;
}
pourquoi tu choissis un switch plutôt qu'un
if ($sens == $cas)
if ( $i < $j*$t/8 ) $k = -$i+$j*$t/8;
else $k = $i-$j*$t/8;
le pb a déja été posé par anthomicro je crois.
enfin, une question pour dominion :
"tu trace en software et c'est ça qui est lent ": j'ai pas tres bien compris ce que tu veux dire par la, peux-tu m'expliquer (si c'est lent en software, ca voudrait dire que ca l'est moins en hardware, une palette graphique par exemple... je vois pas trop ce que tu entends par la. merci)
Merci
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 21 févr. 2005 à 22:12
Salut
la synthaxe exacte est :
document.getElementById('iddumachin')....=
ça remplace les document.all de MSIE
ou les iddumachin.... de IE
ou les documentbyname sauf que la faut que tu remplace les atributs name par des atributs ID
enfin voila, c'est plus W3C...
enfin, on peut pas t'en vouloir pour ça, t'as prévu qqch pour netscape, mais malheureusement, c'est plus utilisé (comparé à Mozilla...)
faut tester la présence de caractères gecko ou khtml pour Konqueror et Mozilla...
sinon, pour ton code php en lui meme, j'ai pas tout regardé, dans l'ensemble ça a l'air pas trop mal, sauf quelques choses plutot désagréables à lire comme :
index.php ligne 94, 97, 105, 109, 115, et 118
if ( $couleur2 == "" ) {
qui aurait du etre remplacé par if (!$couleur){
qui est bien plus compréhensible, et plus rapide à exécuter...
ceci n'eszt pas compatible... (ou ne l'était pas...)
mieux vaut mettre ça en CSS
sinon, tu as exactement 15 ouvertures fermetures de tags php, je ne trouves personellement pas ça super super....
mais tu fais ce que tu veux à ce niveau la....
sinon, t'as pow pour les puissances... (polaire.php l 13)
enfin ça reste pas mal
cs_koko
Messages postés654Date d'inscriptionlundi 14 janvier 2002StatutMembreDernière intervention20 février 2005 20 févr. 2005 à 13:19
firefox et konqueror.
En fait, tu as codé pour IE qui est tres laxiste par rapport aux autres browsers.
ca doit venir d'une utilisation différente de getelementbyid ou des choses comme ca.
Je n'ai malheureusement pas le temps de me pencher plus dedans.
stepibou
Messages postés112Date d'inscriptionjeudi 11 mars 2004StatutMembreDernière intervention11 octobre 2006 20 févr. 2005 à 13:01
hello,
je viens d'essayer sur opera, et c beaucoup plus fluide,
que ie 6.
l'utilsition du cpu est aussi plus faible.
dominion : je comprend ce que tu veux dire,
mais c bien la generation de l'image en php qui est la plus longue.
si tu t'y connais en js, a tu un player plus court,
plus performant, et compatible avec tous les navigateurs.
anthomicro : il faut utiliser opera ou autre , ou diminuer la taille de l'image.
si l'ordi n'as pas eu le temps de calculer l'image, il ne l'affiche pas.
merci pour ton analyse.
koko : quel est le navigateur ou ca marche pas?
je m'y connais pas trop en js si quelqu'un sait ?
bon a+, bonne prog. ;-)
cs_Anthomicro
Messages postés9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 20 févr. 2005 à 12:41
L'image n'est absolument pas réalisée en javascript... Regarde bien...
Par contre j'ai voulu tester le script, j'ai plein d'erreurs, l'image n'est pas générée (j'ai le texte alternatif à la place).
a +
cs_dominion
Messages postés230Date d'inscriptionmardi 21 janvier 2003StatutMembreDernière intervention15 mai 2008 20 févr. 2005 à 12:32
Ben le php est server side, donc pour animer faut autre chose. Ici c'est du JS. Le problème avec ça c'est que c'est interprêté par le navigateur en boucle (déjà fort long) et tracé en software pur ! La génération d'image peut être très rapide en php, son affichage s'il veut etre fluide sera une usine à gaz !
Le mieux est de trouver un autre language pour ça (flash par exemple) ou dans le cas où ça s'y prêterais, écrire une classe d'écriture gif qui sauverait les images dedans te les afficherait, et on aurait donc une fluidité gif !
cs_Anthomicro
Messages postés9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 20 févr. 2005 à 12:02
C'est tracé en JS ça ? je vois plutôt du code PHP ?!
cs_dominion
Messages postés230Date d'inscriptionmardi 21 janvier 2003StatutMembreDernière intervention15 mai 2008 20 févr. 2005 à 11:59
Personellement, je pense que c'est ton js qui est lent. Je n'en suis pas sûr vu que je n'ai pas exécuté, mais j'ai eu le même problème que toi avec du texte qui défile : ça va très vite bouffer le cpu...
Je ne pense pas qu'il y ai une vraie solution : tu trace en software et c'est ça qui est lent ! Le mieux serais d'essayer en flash...
To be continued ;-) Tiens-nous au courant.
cs_Anthomicro
Messages postés9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 20 févr. 2005 à 11:33
Salut,
tu peux remplacer tes switchs par des if() et tes for() par des while(), bon tu gagneras pas grand chose evidemment...
a ++
cs_koko
Messages postés654Date d'inscriptionlundi 14 janvier 2002StatutMembreDernière intervention20 février 2005 20 févr. 2005 à 10:37
Le code javascript est un peu capricieux... une compatibilité avec tout les navigateurs ca serait chouette !
A cause de ce code js, je n'ai pas pu tout tester et ne peut donc pas dire les bons points des mauvais.
19 avril 2006 à 21:10
19 avril 2006 à 21:05
Cordialement,
Kevin (kegi@hotmail.com)
23 mars 2005 à 09:45
function wait(temprestant,act){
...
setTimeout(act, 10); //par exemple
}
21 mars 2005 à 18:11
Stepibou, je t'envoie ce que j'ai fait.
22 févr. 2005 à 16:56
Bien trouvé le dégradé en polaire et l'animation.
Attention, il n'y a pas de 's' dans getElementById('texte1'). En effet, il n'y a qu'un seul élément pour un seul id ;o)
Sinon dans les fonctions js de index.php, je n'ai pas compris pourquoi tu as mis des '[0]' derrière les 'oSelects' ? Chez moi il faut que je les enlève pour que ça fonctionne.
Pour gagner en fluidité, peut-être que tu peux essayer de créer toutes les images qui vont servir pour un dégradé animé, par exemple en png, et ensuite tu les appelles en js. Ainsi tu évites de re-créer les mêmes images à chaque passage de la boucle. C'est juste une idée comme ça ;o)
A+
Arnaud
22 févr. 2005 à 16:03
merci coucou747 pour ton aide :
je n'ai pas les ouvertures fermetures de tags php ?!?
j'ai le report d'erreur pourtant sur on, d'ou ca viens?
Pour zoukozouko, ca ne peux pas etre lent :
c plus ou moins fluide, ou carement ca n'affiche pas
si c'est trop relou.
Pour Konqueror et tout le tintoin, je l'avoue, j'y connait rien, tout le js qui y a ici, a ete adapté à l'arache d'autres sources. désolé, demerdez vous!...
mais pour me faire pardonner, les ptits lou, je vous
prépare un petit truc sympas, et qui à priori ne sera pas
une locomotive à vapeur. ;-)}
22 févr. 2005 à 01:39
22 févr. 2005 à 00:55
J'ai déjà fait des tests il y a longtemps sur 10000 itérations, verdict : temps de génération identique.
a +
22 févr. 2005 à 00:54
c'est vrai que sur 1000000 d'opération à la seconde, le test de la présence d'une accolade ne ralenti pas beaucoup, mais forcément, le fait de rajouter des accolades inutiles oblige à empiler, dépiler, et à faire un test en plus s'il ne rentre pas dans le if (pour savoir à quel moment il doit passer en séquence).
tu devrais essayer avec une plus lonugue séquence de code.
Le pb de ton test c'est qu'il n'y a pas de séquence après le if
essaie un code du type :
{
$k = 0;
for ($i=0; $i<100; $i++)
{
if ($i%10)
{
if ($i%2) {$k++;}
else {$k += 2;}
}
else
{
if ($i%2) {$k++;}
else {$k += 2;}
}
if ($i%3) {$k++;}
else {$k += 3;}
$k--;
}
contre:
{
$k = 0;
for ($i=0; $i<100; $i++)
{
if ($i%10)
if ($i%2) $k++;
else $k += 2;
else
if ($i%2) $k++;
else $k += 2;
if ($i%3) $k++;
else $k += 3;
$k--;
}
Je ne mets jamais d'accolade s'il n'y a qu'une instruction apres le if, et ceci pour des raisons de clarté(j'arrive d'autant mieu à lire un code qu'il y a peu d'accolades...
Et puis dès que je vois une acolade, je cherche la deuxième instruction...
Bon toutes facons, c'est sûrement une habitude personnelle.
Je posait la question surtout pour me rassurer au niveau du temps d'exécution.
coucou747 : tu n'as pas fait de test pour le swith avec un seul case, comparé au if, tu en penses quoi?
22 févr. 2005 à 00:27
en tout cas pour les images 320 x 240 (par défault), limage est affichée en moin d'une seconde (vu les comentaires je m'attendait à bien pire)
quelqu'un peut-il me dire dans quel cas l'exécution est lente?
22 févr. 2005 à 00:25
tout dépends de ce que tu apelles se tromper...
ça surcharge effectivement la pile (teste sur une calto en basic un truc style :
:lbl0
:getkey->a
:if a=0:then:goto 0:end
:goto 0
si tu n'apuis pas sur une touche, en peu de temps tu vas voir erreur memory... car la pile aura été remplie...
pour les acolades, ça ne joue pas un grand role, c'est pas un problème grave, mais l'utilisation des gotos dans nimporte quel langage est vivement déconseillée pour cette raison...
Maintenant, faudrait que j'éteigne mon serveur X, mon serveur apache, mysql ... et que je fasse des benchs... la, c'est vraiment mitigé... les résultats sont vraiment trops proches ou alors s'ingversent tout le temps... je ne peux rien conclure, maic c'est vrai que pour la théorie, tu as raison... maintenant, c'est tellement petit comme optimisation... celle la, moi je ne la fais pas toujours pour laisser plus de claretée...
<?php
function compare($tab,$calc)
{
$temps=array();
$j=0;
echo 'code:, temps d\'exécution pour '.$calc.' calculs, ';
foreach($tab as $code){
$start=microtime();
eval('for ($i=0;$i<10000;$i++)'.$code);
$end=microtime();
echo '----
'.$code.', '.($end-$start).', ';
$j++;
}
echo '
';
}
compare(array('if ($a){$a++;}else{$a=1;}','if ($a)$a++;else $a=1;'),100000);
?>
chez moi, rien de concluant...
22 févr. 2005 à 00:12
J'ai deux questions :
une au niveau de la prog : pourquoi mets-tu des accolades après tes if même s'il n'y a qu'une intruction?
(prévenez moi si je me trompe) mais il me semble que le php n'étant pas compilé, l'utilisation des accolades surcharge la pile d'execution : au lieu de continuer l'exécution du code après le if, (avec ton dode, ) il faut vérifier qu'il n'y a plus d'instructions et qu'on a bien une accolade fermante. En tout cas, c'est sûr que c'est plus clair comme tu l'as codé (mais moins efficace je crois, à vérifier).
2ème question: rectangle.php :
switch ($sens)
{
case $cas :
if ( $i < $j*$t/8 ) {
$k = -$i+$j*$t/8;
} else {
$k = $i-$j*$t/8;
} break;
}
pourquoi tu choissis un switch plutôt qu'un
if ($sens == $cas)
if ( $i < $j*$t/8 ) $k = -$i+$j*$t/8;
else $k = $i-$j*$t/8;
le pb a déja été posé par anthomicro je crois.
enfin, une question pour dominion :
"tu trace en software et c'est ça qui est lent ": j'ai pas tres bien compris ce que tu veux dire par la, peux-tu m'expliquer (si c'est lent en software, ca voudrait dire que ca l'est moins en hardware, une palette graphique par exemple... je vois pas trop ce que tu entends par la. merci)
Merci
21 févr. 2005 à 22:12
la synthaxe exacte est :
document.getElementById('iddumachin')....=
ça remplace les document.all de MSIE
ou les iddumachin.... de IE
ou les documentbyname sauf que la faut que tu remplace les atributs name par des atributs ID
enfin voila, c'est plus W3C...
enfin, on peut pas t'en vouloir pour ça, t'as prévu qqch pour netscape, mais malheureusement, c'est plus utilisé (comparé à Mozilla...)
faut tester la présence de caractères gecko ou khtml pour Konqueror et Mozilla...
sinon, pour ton code php en lui meme, j'ai pas tout regardé, dans l'ensemble ça a l'air pas trop mal, sauf quelques choses plutot désagréables à lire comme :
index.php ligne 94, 97, 105, 109, 115, et 118
if ( $couleur2 == "" ) {
qui aurait du etre remplacé par if (!$couleur){
qui est bien plus compréhensible, et plus rapide à exécuter...
ceci n'eszt pas compatible... (ou ne l'était pas...)
mieux vaut mettre ça en CSS
sinon, tu as exactement 15 ouvertures fermetures de tags php, je ne trouves personellement pas ça super super....
mais tu fais ce que tu veux à ce niveau la....
sinon, t'as pow pour les puissances... (polaire.php l 13)
enfin ça reste pas mal
20 févr. 2005 à 13:19
En fait, tu as codé pour IE qui est tres laxiste par rapport aux autres browsers.
ca doit venir d'une utilisation différente de getelementbyid ou des choses comme ca.
Je n'ai malheureusement pas le temps de me pencher plus dedans.
20 févr. 2005 à 13:01
je viens d'essayer sur opera, et c beaucoup plus fluide,
que ie 6.
l'utilsition du cpu est aussi plus faible.
dominion : je comprend ce que tu veux dire,
mais c bien la generation de l'image en php qui est la plus longue.
si tu t'y connais en js, a tu un player plus court,
plus performant, et compatible avec tous les navigateurs.
anthomicro : il faut utiliser opera ou autre , ou diminuer la taille de l'image.
si l'ordi n'as pas eu le temps de calculer l'image, il ne l'affiche pas.
merci pour ton analyse.
koko : quel est le navigateur ou ca marche pas?
je m'y connais pas trop en js si quelqu'un sait ?
bon a+, bonne prog. ;-)
20 févr. 2005 à 12:41
Par contre j'ai voulu tester le script, j'ai plein d'erreurs, l'image n'est pas générée (j'ai le texte alternatif à la place).
a +
20 févr. 2005 à 12:32
Le mieux est de trouver un autre language pour ça (flash par exemple) ou dans le cas où ça s'y prêterais, écrire une classe d'écriture gif qui sauverait les images dedans te les afficherait, et on aurait donc une fluidité gif !
20 févr. 2005 à 12:02
20 févr. 2005 à 11:59
Je ne pense pas qu'il y ai une vraie solution : tu trace en software et c'est ça qui est lent ! Le mieux serais d'essayer en flash...
To be continued ;-) Tiens-nous au courant.
20 févr. 2005 à 11:33
tu peux remplacer tes switchs par des if() et tes for() par des while(), bon tu gagneras pas grand chose evidemment...
a ++
20 févr. 2005 à 10:37
A cause de ce code js, je n'ai pas pu tout tester et ne peut donc pas dire les bons points des mauvais.