Forums Développement Multimédia

Aller au contenu

Optimisation binaire

CODE Actionscript

58 réponses à ce sujet

#46 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 11 March 2013 - 11:15 AM

Ouf ! Image IPB

Je me suis dit "allez, tu vas y arriver à comprendre ce que fait hubeert"
Donc j'ai joué un peu à faire l'émulateur et exécuté à la main le début du code. Ça plus la remarque de Dldler sur "ouvrir d'un côté, fermer de l'autre" et Ça y est, j'ai une vision d'ensemble de la méthode.
Je trouve que Ça ressemble un peu au jeu: regardez ce code et devinez ce qu'il fait (tiens, Ça pourrait être une idée de jeu à faire entre nous Ça...)

Je trouve cela remarquable à 2 niveau: la concision et la difficulté à le lire.
J'ai eu du mal à accepter qu'un si petit code allait me faire un labyrinthe !

La grosse faiblesse du labyrinthe généré est que les passages tournent toujours du même côté.

Voir le messagedldler, le 11 March 2013 - 10:58 AM, dit :

Bon, une dernière intuition, mais après if faut que je bosse …
Hihihi :)

#47 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 11 March 2013 - 11:30 AM

@ lilive :
:-D
Tu veux une version encore plus concise ?

var murs:uint,_x:int,_y:int,id:int;
graphics.lineStyle(5,0x7F7F7F);
graphics.drawRect(-20,-20,20*31+20,20*31+20);
for (_x=0; _x<31; _x++) {
  murs = (1<< 31) * Math.random();
  for (_y=0, id=1; _y<31; _y++, id<<=1) {
   graphics.moveTo(_x*20, _y*20);
   murs&id?graphics.lineTo(_x*20+20,_y*20):graphics.lineTo(_x*20,_y*20+20);
  }
}

Mais on est d'accord que ce n'est que pour le fun…


[EDIT] (pire : )
Spoiler


#48 Nelchaël

  • Members
  • PipPipPipPipPipPipPipPip
  • 1900 messages

Posté 11 March 2013 - 11:43 AM

Voir le messageGoabonga, le 11 March 2013 - 01:00 AM, dit :

Nelchaël, en fait il est plus optimisé de coder :

var i:int = 0;
for(;i<max;i++){}
 

Pour voir les diferences il suffit d'installer le swfInvestigator (labs.adobe.com), c'est bien de l'optimisation mais rien a voir avec l'utilisation du binaire pour optimiser des calculs qui seront eux aussi retranscrit pour être peut être mal interpreté par la suite .... :)

Goabonga, j'ai installé swfInvestigator, la prise en main de l'outil n'est pas instantanée.

Vu qu'il n'y a pas de int en AS2 (j'ai surtout parlé d'AS2 précédemment), on est bien d'accord que cette boucle est en AS3 (rappelons qu'une différence essentielle avec l'AS2 est que les variables sont remontées en début de fonction).

L'optimisation dont on parle, c'est avant tout le temps de calcul ?
Et la comparaison dont il s'agit est bien la suivante :
Ceci :
var i:int = 0;
for(;i<max;i++){}
par rapport à ceci :
for(var i:int = 0;i<max;i++){}
Dans le deuxième cas, la variable est bien déclarée une seule fois quand même ?
De mon côté, en vitesse, j'ai le même temps.
En AS3, il me semble que le code compilé serait le même.

Maintenant, tu me parles peut-être d'autre chose.
A ce moment là, si on veut appronfondir, on peut éventuellement voir cela dans un autre sujet.;)
nelchael.fr freelance flash CS6

#49 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 11 March 2013 - 11:49 AM

coucou;
oublie mon code il est pourri lol.
Je lai quand meme un peu amelioré en ouvrant les portes au hasard ca fait moins je fonce droit et je vais a gauche ..


traceTraitHorizontal (0,"traitHorizontal",gL-2)
trace juste le trait du haut
en binaire Math.pow (2,15); ou 1<<15 donne 32768 dont la representation est en binaire est 1 suivi de 15 zero soit 1 000 0000 0000 0000; si j'ôte 1 a ce chiffre ca donne
14 1( un) ensuite lorsque je trace l'ordi voit que cest un 1 et place le trait horizontal; la j'ai gL-2 parceque plus haut dans le code j'avais deja ajouté un 1 a 1<<15; donc je lui enleve 2.

c'est aussi un probleme d'intervalle. Il y a un intervalle (mur horizontaux)de moins
entre les mur verticaux.
mon code lit cette variable

Pareil pour la ligne 15 donc.

Les conditions sont du bricolages..

if( j==1 && nom=="traitHorizontal" && i!=7 && i!=9 && i!=12) {trait._x-=50}

il faut y que je precise que le code lit la variable de droite a gauche; mais affiche les trait de gauche a droite

donc si j==1, cest a dire si tu es train de lire le bit 1 qui bien que son chiffre soit 1 correspond au deuxieme bit de la variable; tu decale les trait de -50 (longueur du trait et ca ouvre la porte sur la ligne du haut.
Pour des raison dues au ~jene peux mettre aucun trait horizontal en bit 1 donc je le force je lui dit si on est sur le bit 1 decale les trait de 50 sauf la ligne 7 9 et 12; pour obtenir quelque chose de cohérent..


cest le meme principe pour les autres conditions de la ligne en dessous.;en inversant i et j

le mélange de logique est parfois bon; mais la autant continuer dans la meme logique..Mon idée est celle ci je gere les trait verticaux et horizontaux d'une maniere differente.. a savoir un variable pour horizontal et un autre pour le vertical comme ca je trace ma ligne 5 mettons


|

|
-- ---- --

|

avec les OBS on doit pouvoir tester..mais bon c'est qu'une intuition..

#50 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 11 March 2013 - 12:16 PM

Voir le messagehubeert, le 11 March 2013 - 11:49 AM, dit :

coucou;
Alors du coup, si je peux me permettre, oui :-D…
Y a doublon et donc optimisations possibles


Bon. VU pour le 1. Mais en décalant tous les traits à gauche, tu ouvres toute la colonne 1… d'où la possibilité d'aller tout droit.

En fait, il doit y avoir un nombre écrit en binaire tel qu'il soit un 1, puis un zéro, puis douze 1 (de droite à gauche bien sûr)
Quelque chose comme ((1<<15)-2) ? Qui devrait te permettre de tracer le trou uniquement sur la première ligne…

Après il faut que je creuse pour le reste…

++

#51 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 11 March 2013 - 12:52 PM

Voir le messagedldler, le 11 March 2013 - 11:30 AM, dit :

Tu veux une version encore plus concise ?
Héhé ! C'est fou !

Je trouve qu'il y a quand même une boucle en trop dans ton code:

graphics.lineStyle(5);
graphics.drawRect(0,0,640,640);
for (var i:int=0; i<31*32; i++) {
    var murs:uint = i%32==0 ? (1<< 31) * Math.random() : murs;
    graphics.moveTo(20+int(i/32)*20,20+i%32*20);
    murs&(1<<i%32)?graphics.lineTo(20+int(i/32+1)*20,20+i%32*20):graphics.lineTo(20+int(i/32)*20,20+(i%32+1)*20);
}


ou encore


graphics.lineStyle(5);
graphics.drawRect(0,0,640,640);
for (var i:int=0, x:int, y:int; i<31*32; i++) {
        var murs:uint = (x = int(i/32)*20+20)*0 + (y = i%32*20+20)==20 ? (1<< 31) * Math.random() : murs;
        graphics.moveTo(x,y);
        murs&(1 << i % 32)?graphics.lineTo(x+20,y):graphics.lineTo(x,y+20);
}

 

Tout ça me renvoie loin en arrière et me rappelle mes débuts, je participais alors à un concours où le but était de créer des programmes de 20 lignes en basic GFA. En cherchant un lien je viens de tomber sur un jeu de labyrinthe en 3D en 20 lignes (mais pas de génération aléatoire je pense). C'est ici, faut voir le code !

#52 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 11 March 2013 - 12:55 PM

coucou;

il ne fait un pas couloir tout droit sur le bit 1..(mais bon comme il faut deux hasard d'affilé pour que ca marche ca doit etre le cas le plus courant mais c'est facilement gérable.
j'ai fait un version ou les portes sont ouverte au hasard et la le labyrinthe est plus sympa
oui j'y avait pas pensé de calculer le nombre.; oui cest faisable
donc on part de (1<< 15) - 1 la tous les traits horizontaux sont affiches si je veux ouvrir un porte a l'emplacement 9 celui ci est représenté par le bit 8
on fait comme ca on se sert de XOR
((1<<15) -1 ) ^ 1<<8

il on peut visualiser ce nombre avec la methothe AS Numbert.toString(base) ici 2 mais le plus simple est une calculette réglé en mode programmeur;

#53 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 11 March 2013 - 13:42 PM

Merci pour les explications.

J'ai repris ton code et mis a ma sauce pour les noms de variable, et supprimé les ifs (j'ai fait l'entrée et la sortie avec la formule que tu viens de donner)

Ça donne Ça (en AS2, symboles partagés dans la bibliothèque : horizontal et vertical) :

tous = (1 << 15)-1;
bords = (1 << 15)+1;
t = 0;

trait("horizontal",00,tous ^ (1 << 2));// Le haut : tous sauf une sortie en bit 2
trait("horizontal",15,tous ^ (1 << 12));// le bas : tous sauf une sortie en bit 12
trait("vertical",00,bords);// La première ligne de murs verticaux
for (var h = 1; h<15; h++) {
  murs = random(tous);// Des murs au hasard
  trait("horizontal",h,murs & ~1);// Les murs sauf les premiers :
  trait("vertical",h,(~murs) | bords);// Verticalement : le contraire + les bouts
}

function trait(nom, i, val) {
  for (var j = 0; j<16; j++) {
   if (val & 1 << j) {
    mur = attachMovie(nom, "", t++);
    mur._x = 50*j;
    mur._y = 50*i;
   }
  }
}

Reste le pourquoi des 7 9 et 12… Je cherche encore :)

#54 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 11 March 2013 - 13:47 PM

Voir le messagelilive, le 11 March 2013 - 12:52 PM, dit :

Héhé ! C'est fou !

Je trouve qu'il y a quand même une boucle en trop dans ton code:

graphics.lineStyle(5);
graphics.drawRect(0,0,640,640);
for (var i:int=0; i<31*32; i++) {
        var murs:uint = i%32==0 ? (1<< 31) * Math.random() : murs;
        graphics.moveTo(20+int(i/32)*20,20+i%32*20);
        murs&(1<<i%32)?graphics.lineTo(20+int(i/32+1)*20,20+i%32*20):graphics.lineTo(20+int(i/32)*20,20+(i%32+1)*20);
}
J'ai le vertige :D
Je croyais commencer à lire le binaire, mais non. Je ne lis que le mien. Sinon, 32 for contre 1024 if… ça se discute quand même.

#55 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 11 March 2013 - 14:01 PM

coucou;
en fait je lui dis si tu es sur le bit 1 decale le trait sauf sur la ligne 7 9 et 12.
donc pour que ca marche il faut qu'il y ai un trait sur le bit 1 de la ligne 0 (ouverture)(il y est tjs et un trait sur le bit 1 de la ligne 1,2,3,4,5,6,8,10,11,13(la cest le hasard)

#56 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 11 March 2013 - 14:07 PM

OK merci Hubert. J'ai compris cette fois.

#57 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 11 March 2013 - 16:07 PM

Voir le messageMonsieur Spi, le 11 March 2013 - 13:55 PM, dit :

Vous êtes tous des grands malades ..... :P

Je confirme ! :texas:
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#58 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 12 March 2013 - 21:37 PM

Voir le messageNelchaël, le 11 March 2013 - 11:43 AM, dit :

Goabonga, j'ai installé swfInvestigator, la prise en main de l'outil n'est pas instantanée.

Vu qu'il n'y a pas de int en AS2 (j'ai surtout parlé d'AS2 précédemment), on est bien d'accord que cette boucle est en AS3 (rappelons qu'une différence essentielle avec l'AS2 est que les variables sont remontées en début de fonction).

L'optimisation dont on parle, c'est avant tout le temps de calcul ?
Et la comparaison dont il s'agit est bien la suivante :
Ceci :
var i:int = 0;
for(;i<max;i++){}
par rapport à ceci :
for(var i:int = 0;i<max;i++){}
Dans le deuxième cas, la variable est bien déclarée une seule fois quand même ?
De mon côté, en vitesse, j'ai le même temps.
En AS3, il me semble que le code compilé serait le même.

Maintenant, tu me parles peut-être d'autre chose.
A ce moment là, si on veut appronfondir, on peut éventuellement voir cela dans un autre sujet. ;)


La façon dont tu tapes ne place pas le bytecode de la meme manière ( SWF Disassembler ), regardes la difference entre les deux methodes, sa genere des macros L1 L2 normalement.

#59 Nelchaël

  • Members
  • PipPipPipPipPipPipPipPip
  • 1900 messages

Posté 12 March 2013 - 23:31 PM

A moins d'une erreur d'inattention, j'ai exactement la même chose.
J'ai compilé ça :
public function test():void
        {
        trace("hors");
        var max:int=10000000;
        var i:int=0;
        for(;i<max;i++)
                {
                }
        }
et ça :
public function test():void
        {
        trace("dans");
        var max:int=10000000;
        for(var i:int=0;i<max;i++)
                {
                }
        }
J'ai nommé les swf "hors.swf" et "dans.swf".

J'ai regardé ensuite dans "SWF Disassembler".
A part les textes "dans" et "hors", tout m'apparaît comme étant identique.
J'ai fait des captures écran des deux (pour chaque position de l'ascenseur), basculé de l'un à l'autre, recommencé tout deux fois (compilation, captures...), je n'ai vu aucune différence.
Je peux joindre les swf et même les captures si besoin.
Tu n'utilises peut-être pas Flash pour compiler d'où une différence de ton côté...
nelchael.fr freelance flash CS6



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)