Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 18/03/12 14:10 Sujet du message: Optimisation (distance/globales)
Salut, j'aimerais savoir lequel de ces deux codes est le meilleur pour calculer la distance entre deux points :
Jass:
function Distance takes real x1, real y1, real x2, real y2 returns real
local real dx = x2-x1
local real dy = y2-y1
local real a = Atan(dy/dx)
if dx == 0 then
set a = bj_PI/2
endif
return dx/Cos(a)
endfunction
Jass:
function Distance takes real x1, real y1, real x2, real y2 returns real
return SquareRoot((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
endfunction
Sinon, j'avais une autre question : tout le monde préconise d'utiliser des variables globales pour les groupes/locations/etc parce que les créer coûte cher au pc. Mais est-ce que ça vaut aussi pour les réels, integers, boolean...? _________________
Inscrit le: 23 Aoû 2007 Messages: 7146 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 18/03/12 15:24 Sujet du message:
Je ne connaissais pas la première méthode, même si ça reste de la géométrie de base.
La réponse est évidente, la deuxième méthode car moins d'opérations.
En effet, il faut garder en tête que le jass est un langage interprété, il est fort probable que le temps d'interprétation de ces lignes de code est bien plus coûteux que l'opération en elle même.
De plus comme le résultat est forcément positif, parfois dans certains calculs, plutôt que d'utiliser la distance on peut utiliser son carré (on évite l'utilisation de SquareRoot).
Pour les variables, tout est une question de portée, il faut utiliser une variable globale quand on a besoin plusieurs fois au cours du temps (même si on peut toujours passer une variable locale en argument).
Je veux dire qu'il faut utiliser le type de variable le plus approprié à la situation.
Mais y'a un truc en savoir en jass, il y a un bug pour les variables locales.
Et oui pour les handle il vaut mieux éviter de les créer/détruire si c'est possible. Mais cela n'a rien à voir que cela soit une variable globale ou locale.
"real", "integer", "boolean" ne sont pas des sous type d'handle. _________________
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 18/03/12 15:48 Sujet du message:
C'est sûr que la deuxième méthode fait moins de calculs, mais comme il y a une racine carrée, je me suis dit...
Mais, t'as raison, mieux vaut tout simplement laisser tomber la racine.
Ps : Pourquoi t'es messages stagnent à 6666, le forum a craqué sous le poids de tous tes postes ? _________________
Inscrit le: 23 Aoû 2007 Messages: 7146 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 18/03/12 16:03 Sujet du message:
J'ai oublié de préciser dans quel cas il est intéressant de recycler les handle.
- pour les group : avoir un seul groupe statique pour les énumérations d'unité que l'on a pas besoin de garder dans le temps (même pas besoin d'utiliser GroupClear, GroupEnum... supprime toutes les unités du group, avant d'éventuellement en rajouter).
Il vaut aussi mieux utiliser un filtre null, puis une loop avec FirstOfGroup/GroupRemoveUnit, car c'est plus efficace, mais ce coup ci ça vient du fait qu'à chaque évaluation d'un filtre non null, un nouveau thread est lancé.
- pour les timer : recycler les timer, plutôt que les créer/détruire, avec un système d'attachement de donnée au timer, comme TimerUtils.
Pour diverses raisons, dont rendre le système d'attachement efficace.
- utiliser une location voir plusieurs statiques, à utiliser avec MoveLocation si tu veux utiliser GetLocationZ, sinon chaque fonction qui utilise des loc à son équivalent avec des coordonnées.
- pour les dummy unit, parce que créer une unité est l'opération la plus couteuse qui soit.
J'en oublie surement mais ce sont les principales.
Pour le reste il est plus efficace de détruire/créer, toujours pour la même raison, le jass reste un langage interprété, un recyclage induirait plus de lignes de code que simplement utiliser create/destroy, et donc serait probablement moins efficace du fait du temps d'interprétation du code. _________________
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum