Forums Développement Multimédia

Aller au contenu

Optimisation Modulo

CODE Actionscript

9 réponses à ce sujet

#1 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6954 messages

Posté 08 August 2013 - 15:38 PM

Salut,

Pour un jeu où je dessine des textures, j'utilise des modulos dans des boucles pour tracer mes textures et les faire boucler, le problème c'est que le modulo est une opération lourde et que j'ai énormément d'itérations sur mes boucles, du coup ça se ressent un peu, je cherche donc une solution pour alléger l'opération.

En faisant des recherches je suis tombé sur :

Citation

if (n % x == 0) peut s'écrire if (n & (x-1) == 0)

Selon la doc : http://help.adobe.co...tml#bitwise_AND

Citation

Convertit expression1 et expression2 en entiers non signés de 32 bits, et exécute une opération Boolean AND sur chaque bit des paramètres de l’entier. Les nombres à virgule flottante sont convertis en entiers en supprimant les chiffres après la virgule. Le résultat est un nouvel entier de 32 bits.

Elle stipule aussi que :

Citation

L’opération AND au niveau du bit de 13 (1101 en binaire) et 11 (1011 en binaire) donne 9 car les première et dernière positions des deux nombres contiennent le nombre 1.
1101
& 1011
----
1001


Et c'est là que j'ai un problème, car si l'opération fonctionne parfaitement pour certaines textures, pour d'autres je n’obtiens pas du tout le bon résultat, ou du moins je ne fais certainement pas le bon calcul.

Par exemple :

trace(2560%2560); renvoie 0
trace(2560 & (2560-1)); renvoie 2049

Je comprend bien que c'est lié à l'opérateur et à la manipulation sur les bits, comme le stipule la doc, mais je ne trouve pas de formule simple pour m'assurer que ça marche à tous les coups sans avoir à connaitre à l'avance la valeur binaire du nombre que je veux faire boucler, et il me manque certainement des bases en binaire pour trouver ça tout seul.

Quelqu'un aurait une solution, qui fonctionne dans tous les cas, pour optimiser le modulo, ou une explication sur la méthode pour y arriver avec l'opérateur "&" ?

#2 darkrat

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 61 messages

Posté 08 August 2013 - 20:25 PM

et si tu forces la conversion dans un truc du style a-int( a / b )*b c'est lourd aussi?

#3 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6954 messages

Posté 08 August 2013 - 20:46 PM

Oui c'est pareil, tu fais une conversion (int) puis une division et une multiplication, c'est plus lourd qu'une simple opération sur le bit.

#4 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 09 August 2013 - 10:56 AM

L'opération n & (x-1) fonctionne uniquement sur des puissances de 2, à voir pour x - (n * (x/n as int)).

L'ActionScript n'est pas un langage rapide à la base, ça m'étonnerait que tu arrives à avoir des performances folles de toutes manières ...
Word hard, play hard.

#5 Nelchaël

  • Members
  • PipPipPipPipPipPipPipPip
  • 1900 messages

Posté 09 August 2013 - 12:04 PM

Le modulo est en effet assez coûteux.
Dans le cas de compteurs, ce qui peut faire gagner beaucoup, c'est simplement de réinitialiser la valeur à 0.
Exemple, ceci :
if(++nb_===50)
        {
        nb_=0;
        }
nb_2=20*nb_;
est beaucoup plus rapide que :
nb_2=20*((++nb_)%50);
Si on a besoin de la valeur "non modulo", on peut utiliser un autre compteur séparé, ça ne consomme presque rien.
nelchael.fr freelance flash CS6

#6 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6954 messages

Posté 09 August 2013 - 12:50 PM

Salut,

Galacta> Merci pour la confirmation sur les puissances de 2, c'est bien ce qu'il me semblait, par contre je ne cherche pas la performance absolue, juste grappiller quelques cycles là où je peux pour libérer de la place pour le reste des traitements. Je sais que l'AS n'est pas le plus rapide, mais je travaille sur un jeu en Raycasting que j'avais commencé il y a très longtemps et que je n'avais jamais fini, arrivé où j'en suis je vais finir avec ce langage, pour le moment j'arrive à tourner à 40 fps, ce qui n'est pas si mal.

Nelchael> pourquoi je n'y ai pas pensé plus tôt ? Bien sur qu'une simple remise à zéro du compteur devrait pouvoir faire l'affaire :smile: ... enfin je crois, je vais tester ça et je reviendrai vous dire ce qu'il en est.

Merci pour vos réponses, je m'y recolle et on verra bien.

#7 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 11 August 2013 - 15:36 PM

coucou;
J'ai pas forcement compris le problème Image IPB/>/> ; mais si tu incrémentes tes boucles de la valeur du modulo?

des algorithmes de modulo moins gourmand ont été développés avec les OSB basé sur le fait que tous les nombres entiers se décomposent de maniere unique en somme de puissance de 2 ( les paysans russes ainsi que les egyptiens se servaient de cette particularité pour faire leur calcul) mais je ne retrouve pas les algo sur le net..

j'ai retrouvé le lien..

http://guihaire.com/code/?p=457

Modifié par hubeert, 11 August 2013 - 16:10 PM.


#8 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6954 messages

Posté 11 August 2013 - 16:14 PM

Yop,

En fait la solution donnée par Nelchael répond à mon problème, j'aurai du y penser plus tôt.
Je cherchai juste à ne pas me servir d'un modulo car c'est trop lourd comme opération.

Je ne peut pas incrémenter mes boucles de la valeur du modulo, pour prendre un exemple :

J'ai une texture de 2560 pixels de large que j'affiche dans un bitmap de 640 pixels de large.
Je n'affiche donc qu'une partie de ma texture.

Je veux déplacer cette texture à l'écran, je vais donc décaler le point à partir duquel je dessine ma texture.
Mais je veux que la texture boucle lorsque à l'écran je dépasse sa taille normale (2560).

Je peux donc soit utiliser simplement un modulo qui regarde la taille de la texture + le point de décalage et replace le point à tracer sur la taille normale de la texture. Soit beaucoup plus simplement, je remet à zéro le décalage lorsque je dépasse la taille de ma texture, tout en conservant la valeur du décalage.

#9 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 12 August 2013 - 23:19 PM

Ben en plus maintenant tu sais que pour améliorer les performances de ton appli tu as tout un tas d'outils à ta disposition, des russes, des égyptiens, surement des grecs et des arabes, et que s'ils ne suffisent pas tu peux repasser derrière le compilateur pour vérifier que le bytecode est assez optimisé à ton goût ! Très instructif ton lien huubert, merci :)

#10 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6954 messages

Posté 13 August 2013 - 00:27 AM

Re,

Lol, je n'avais pas vu le lien que tu donne Hubeert car tu l'as posté après ma réponse, mais c'est des grands malades, bon en tout cas comme le dit Lilive avec ça y a tout pour optimiser la chose, merci.



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

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

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP