JeuxOnLineForumsPlusConnectés : 363 (sites) | 673 (forums)Créer un compte
Forum jeux-vidéo>Neverwinter Nights
Maskado
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > EffectToString (SetLocalEffect spotted ^_^ ) RSS
   
Répondre
Partager Outils Rechercher
Sire Pom-pom
Roi
 
Merci cela clarifie pas mal de chose, même si je ne sais pas ce qu'un un algo de "hashtable", mais j'irais voir.

Je bloque encore un peu néanmoins .
Si tu as un peu de temps ...
En y réfléchissant je crois que c'est là que je me perds:
Code:
string sChaine ="";
while(...)
{
       sChaine+="foo";
}
Je ne crois pas que la boucle change grand chose au problème mais bon... Là je vois pas comment le compilateur peut s'en tirer pour donner une longueur à sChaine. Evidement si sChaine est aussi un pointeur vers un char* la question ne se pose pas. Mais il faut bien qu'elle soit quelque part, la chaîne obtenue à la fin, et donc que le compilateur ait pu extrapoler sa longueur... Il est un peut tard en même temps donc si je suis en train de me noyer dans une tasse d'eau, ignore moi.
Lien direct vers le message - Vieux
Eyrdan
Roi
 
C'est assez simple, et c'est la raison pour laquelle la manipulation de chaines de caractères est si coûteuse. Lorsque tu fais face a une concaténation de chaines, ce n'est pas la chaine originale qui est agrandie, mais plutôt le compilateur crée une nouvelle chaine ayant la longueur de la somme des deux autres. En C cela serait similaire a:

char * foo1 = "foo1";
char * foo2 = "foo2";

// foo1 += foo2;
char * tmp = foo1;
int i;
foo1 = (char *) malloc ( (strlen(foo1) + strlen(foo2) + 1) * sizeof (char) );
for (i = 0; i < strlen(tmp); i++)
foo1[i] = tmp[i];
for (i = 0; i < strlen(foo2) ; i++)
foo1[i + strlen(tmp)] = foo2[i];

Biensur ce n'est pas la meilleure façon de le faire en C (on n'a qu'a utiliser strcat), mais je voulais illustrer le principe (sans compter que ce code a actuellement une fuite de mémoire -- ancien contenu de foo1 est encore en mémoire et perdu). Le "+1" est pour stocker la valeur NULL a la fin, que ici j'assume est donner par défaut par malloc (ce qui n'est pas nécessairement vrai sur toutes les plateformes).

Sachant ceci, tu peux t'imaginer que le NWScript suivant est un gaspillage de ressources extravagant:

string foo = "";
int i;
for (i = 0; i < 10; i++)
foo += IntToString(i);

(ceci va créer lors de son exécution 10 string temporaires, et faire n (n+1)/2 donc 55 copies de caractères .. c'est un algorithme d'ordre O(n^2)... ouch)

Un bon compilateur C est capable de reconnaitre des structures de ce type et de les optimiser les transformant en:

char * foo = (char *) malloc (11 * sizeof (char));
int i;
for (i = 0; i < 10; i++)
foo[i] = '0' + i;

(ceci ferait exactement 10 assignement de caractere, produisant un algo d'ordre O(n))

Mais ce n'est pas le cas du compilateur de Aurora... le compilateur de Torlack effectue un peu plus d'optimisation que celui de BioWare, mais il ne reconnaitrait pas un algo comme celui ci (son compilateur ne fait qu'optimiser en sauvant des sauts de branche).

Ceci dit, je crois qu'il est évident qu'il est beaucoup plus avantageux d'encoder sous forme d'entier plutôt que sous forme de string. Je crois que ma branche de carrière devient de plus en plus évidente. Si vous n'avez pas devine, je suis ingénieur en informatique spécialisé en programmation de système d'exploitations et en compilateurs.
Lien direct vers le message - Vieux
Sire Pom-pom
Roi
 
Merci mille fois Eyrdan, cette fois ci c'est bon
Je vais me coucher maintenant...
Lien direct vers le message - Vieux
Avatar de Jedaï
Jedaï
Alpha & Oméga
 
Avatar de Jedaï
 
En tout cas, c'est une bonne nouvelle que tu connaisse maintenant ce forum .
Vu tes compétences, même si tu ne passes que de temps en temps, ce sera déjà très profitable pour nous tous .

Oui j'ai regardé le code de ta dernière version, et il est vraiment très bien. Par contre c'est une mauvaise nouvelle pour moi que les manipulations de chaînes soit si coûteuses en NWScript....
(Enfin c'est sûr qu'il ne pouvait pas laisser des "chaînes" comme en C, un peu trop compliqué pour un langage qui se veut quand même "grand public", enfin...)
Lien direct vers le message - Vieux
Eyrdan
Roi
 
Citation:
Provient du message de Jedaï
Par contre c'est une mauvaise nouvelle pour moi que les manipulations de chaînes soit si coûteuses en NWScript....
(Enfin c'est sûr qu'il ne pouvait pas laisser des "chaînes" comme en C, un peu trop compliqué pour un langage qui se veut quand même "grand public", enfin...)
Si quelqu'un était assez aventureux pour entreprendre l'implémentation d'un compilateur faisant l'optimisation, cela serait moins coûteux sur le produit final. Ne demandez pas a Torlack de le faire, j'ai déjà touche le sujet avec lui et c'est trop gros comme projet pour le temps qu'il est prêt a y allouer. Il y a des chances par contre que OpenKnights le fassent éventuellement.
Lien direct vers le message - Vieux
Sire Pom-pom
Roi
 
Citation:
Il y a des chances par contre que OpenKnights le fassent éventuellement.
Une bonne très bonne nouvelle. Mais je crois que vous avez déjà pas mal de pain sur la planche . Je ne me rends pas compte (du tout, comme tu dois t'en douter) de la difficulté de porter un compilateur pour nwscript d'un système d'exploitation à l'autre. Ce serait tout de même un comble que Linux et MacOS aient un meilleur compilateur que Windows .
Lien direct vers le message - Vieux
Eyrdan
Roi
 
Citation:
Provient du message de Sire Pom-pom
Une bonne très bonne nouvelle. Mais je crois que vous avez déjà pas mal de pain sur la planche . Je ne me rend pas compte (du tout, comme tu dois t'en douter) de la difficulté de porter un compilateur pour nwscript d'un système d'exploitation à l'autre. Se serait tout de même un comble que Linux et MacOS aient un meilleur compilateur que Windows .
Ce serait comique. Les deux plateformes jugées indignes de Aurora par BioWare ayant des outils plus efficaces.
Lien direct vers le message - Vieux
Sire Pom-pom
Roi
 
Peut-être y aura-t-il une bonne âme pour faire profiter les utilisateurs de Windows de vos améliorations (quoi que je comprenne le plaisir que l'on pourrait trouver dans cette revanche), dans la limite du possible étant donné ce que tu dis sur les outils. Où est-ce quasi équivalent à réécrire tout le compilateur (pour ce qui est des librairies C j'ai déjà du mal avec stdio, mais j'imagine que tout est loin d'être standard) ?
Lien direct vers le message - Vieux
Eyrdan
Roi
 
J'imagine que la majorité du travail de OpenKnights devrait est compatible avec Cygwin sous Windows.
Lien direct vers le message - Vieux
Répondre
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > EffectToString (SetLocalEffect spotted ^_^ )
   

Outils Rechercher
Rechercher:

Recherche avancée

Les vidéos de Neverwinter Nights RSS
  • Aucune vidéo pour le moment...
Thème visuel : Fuseau horaire GMT +1. Il est actuellement 03h26.
   

© JeuxOnLine, le site des MMO, MMORPG et MOBA. Tous droits réservés. - Conditions générales d'utilisation - Conditions d'utilisation des forums - Traitement des données personnelles - ! Signaler un contenu illicite