Alléger les script.

Répondre
Partager Rechercher
Citation :
Publié par IXXI Squalthor IXXI
Ben super vos conseil, ca m'a permit d'alléger pas mal de script lol par contre vous parliez de nwn_ff et je l'utilise pour la persistance + quelques fonctions mais apparemment il est bien plus intéressant que ce que je croyais Vous pourriez le détailler un peu plus s'il vous plait car aucune documentation à son sujet sur le net ( du moins que je puisse comprendre ou trouver lol )
Dans l'archive de nwn-ff, tu as un dossier doc qui devrait pas mal te satisfaire, si tu lis l'anglais.
Par ailleurs, je t'invite a ouvrir le scripte ff_fonctions (a moins que ce soit ff_include?) et a bien lire les commentaires au dessus de chaque prototypage de fonctions

Par contre je en me suis pas du tout penché sur le nwn-speech fournit avec ff.... Si quelqu'un sait en gros a quoi il sert....
Citation :
Publié par Heziva
Par contre je en me suis pas du tout penché sur le nwn-speech fournit avec ff.... Si quelqu'un sait en gros a quoi il sert....
D'après mes souvenirs, il sert à intercepter ce qui se dit dans les canaux de discussion (shout, partie, whisp, ...) et permet d'effectuer des traitements appropriés.
Rebonjour

Deja en tant que débutant scripteur ne connaissant rien à la programmation ça me permet de mieux apprendre et comprendre le nwn script

Citation :
Garrath >>-------------------> "Tu ne peux donc pas avoir de 'case' identique. Contrairement a une suite de else if."
Donc si je comprend bien le switch ne peut en aucun cas m'aider dans ce cas:
Code PHP:

int iNivo GetHitDice(oPC);

if (
iNivo <= 5)
{
........
}
else if(
iNivo>=&& iNivo <= 10)
{
..........
}
etc..... 
Car dans un script je vérifie des variables de cette manière ainsi que les niveaux donc ça aurai été pratique d'optimiser tout ça

Citation :
Héziva >>--------------------> "si tu lis l'anglais"
Malheureusement je ne connaît que quelques mots d'anglais et c'est très handicapant pour ff ou autre mais ça ne m'empêche pas d'essayer (P.s à Héziva: le suicide n'est pas puni par la loi mais la complicité de suicide l'est )

Quant aux commandes return, break etc ( je suis très loin de toutes les connaître ), dans quels cas doit-on s'en servir ?
D'après ce que j'ai compris, le switch case peux s'appliquer quand ce que l'on vérifie est la meme chose, mais que l'effet change en fonction du résultat.

Par contre si j'ai tout capté, 1 case = 1 résultat, plusieurs résultats pouvant après avoir le meme effet.

Dans ton exemple il faudrait écrire :
Code PHP:

int iNivo GetHitDice(oPC); 
switch (
iNivo)
{
case 
1
case 
2:
case 
3:
case 
4:
case 
5:
    {
    ...
    break;
    }    
case 
6:
Case 
7:
... 
a la place de
Code PHP:

if (iNivo <= 5

........ 

... 
etc.

Le but étant que la machine fasse le moins de chose possible, dans ce cas l'ecriture avec des if est plus intéressante, parce que plutôt que de comparer son résultat avec chaque case, elle va le comparer 1 fois avec chaque if. Et comme tes if comprennent a chaque fois 4 ou 5 case, c'est plus économe.

sinon pour les "break;" il s'ecrivent après un effet de 1 ou plusieurs case. Mais avec 1 break par effet différent.

"return" c'est ce que te renvoi ta fonction. Et une fois que le return a été fait, la lecture du script s'arrête puisque il a fait ce que a priori tu lui a demandé.

En fait par exemple :
Code PHP:

nRace GetRacialType(oPC); 

c'est une manière courte de dire :
Code PHP:

nRace GetRacialType(oPC)
return 
RACIAL_TYPE_* (oPC); 
Citation :
Publié par IXXI Squalthor IXXI
Rebonjour

Deja en tant que débutant scripteur ne connaissant rien à la programmation ça me permet de mieux apprendre et comprendre le nwn script
Citation :
Garrath >>-------------------> "Tu ne peux donc pas avoir de 'case' identique. Contrairement a une suite de else if."


Ce que je veux dire par 'tu ne peux donc pas avoir de 'case' identique ' c'est simplement cela.
Code PHP:

switch (n)
{
    case 
0:...
             break;
    case 
1:...
             break;
    case 
2:...
             break;
    case 
3:...
             break;
    case 
2:...     // Erreur
             
break;
    default:...
             break;

Le compilateur te sortira une erreur la ou je l'ai indique contrairement a la meme chose avec des if else if
Code PHP:

if (== 0)
....
else if (
== 1)
...
else if (
== 2)
....
else if (
== 3)
...
else if (
== 2)
...
else 
... 
le compilateur ici ne te sortira aucune erreur.
Citation :
Publié par IXXI Squalthor IXXI
Donc si je comprend bien dans le cas de mon script le else if est le mieux ?
Renvoyer ma fonction ? cad ? j'ai du mal a piger
"Ce que te renvoi ta fonction". C'est le résultat que donne ta fonction selon ce que tu lui a demandé.

Pour bcp de cas, une fonction renvoi TRUE ou FALSE.
Par exemple if(GetIsPC(oPC))...
te renvoi un TRUE si le oPC est bien un PC, ou un FALSE si c'est pas un PC.

Mais une fonction peux aussi renvoyer un chiffre par exemple en écrivant :
d4

elle te renvoi 1, 2, 3 ou 4

Elle peux aussi te renvoyer un string, par exemple si tu écrit :
if (sTag = "bidule")...

Elle renvoi le tag de ce qu'elle a cherché, puis le compare avec sTag, et te renvoi une deuxième couche pour te dire TRUE ou FALSE

Faut aussi voir que les integer ne sont pas forcément des chiffres.
RACIAL_TYPE_ELF par exemple, c'est un integer (une constante en fait)

Bref, en gros toute demande faite vie une fonction (tout est fonction quasiment dans le script) renvoi forcément quelque chose. Et après le compare pour savoir qu'en faire.
Attention Morthil tu t'emmelles les pinceaux!!!!

Citation :

"Ce que te renvoi ta fonction". C'est le résultat que donne ta fonction selon ce que tu lui a demandé.
Oui effectivement....

Citation :
Pour bcp de cas, une fonction renvoi TRUE ou FALSE.
Par exemple if(GetIsPC(oPC))...
te renvoi un TRUE si le oPC est bien un PC, ou un FALSE si c'est pas un PC.
Un if n'est pas une fonction. C'est une idication au compileur. Il dit simplement que si la derrirere les parenthese il y a true, continuer a la ligne XX sinon passer a la ligne YY.
Par contre, GetIsPC(oPC) est bien l'appelle de la fonction int GetIsPC(object a).

Tu remarque ici que TRUE et FALSE sont des int. J'en reparle plus tard.

Citation :
Mais une fonction peux aussi renvoyer un chiffre par exemple en écrivant :
d4

elle te renvoi 1, 2, 3 ou 4
d4 est une fonction effectivement. Pour l'appeller faut faire d4(). Son code doit ressembler a ca:
Code PHP:

  int d4()
  {
  return 
radom(4);
  } 
(en admettant que radom(4) soit un int aléatoire pris entre 1 et 4)

Citation :
Elle peux aussi te renvoyer un string, par exemple si tu écrit :
if (sTag = "bidule")...

Elle renvoi le tag de ce qu'elle a cherché, puis le compare avec sTag, et te renvoi une deuxième couche pour te dire TRUE ou FALSE
La fonction qui renvoit le code demandé est string GetTag(object oItem)
Cette fonction prends en argument un objet et renvoie en valeure de retours un string.
== est également une fonction un peu particuliere, qui prends deux arguments et renvoit un booléen (true ou false). On devrait écrire ==(stag, "bidule") mais pour des raisons pratiques, on ne le fait pas.

Citation :
Faut aussi voir que les integer ne sont pas forcément des chiffres.
RACIAL_TYPE_ELF par exemple, c'est un integer (une constante en fait)
Les RACIAL_TYPE_* sont des ints!!!! quelque part, bioware a mis le code suivant:
const int RACIAL_TYPE_ELF = 4;
Ainsi, quand tu écrit RACIAL_TYPE_ELF cela revient strictement au meme que si tu avais écrit le chiffre 4. Mais pour la présentation et la relecture du code, pas évident d'inscrire les chiffres....

Citation :
Bref, en gros toute demande faite vie une fonction (tout est fonction quasiment dans le script) renvoi forcément quelque chose. Et après le compare pour savoir qu'en faire.
Tout ce qui demande un traitement requiere une fonction. Pour simplifier, une fonction ne renvoit pas toujours une valeur en retours (on appelle processus les fonctions qui ne rendent rien.... elles rendent en fait quand meme quelque chose.)
Je me demande d'ailleurs si :
Code PHP:

int nValid GetIsPC(oCreature);
switch(
nValid)
{
    case 
TRUE :
    {
        ... ...
        break;
    }
    case 
FALSE :
    {
        ... ...
        break;
    }

serait plus utile que :
Code PHP:

int nValid GetIsPC(oCreature);
if(
nValid==TRUE)
{
    ... ...
}
else
{
    ... ...

ou signifierait "se compliquer la vie"...
Citation :
Publié par Deyonara
Je me demande d'ailleurs si ... ou signifierait "se compliquer la vie"...
Tout à fait d'accord, mais pour le savoir il faudrait connaître comment le compilateur compile ces deux cas, voire même 1000 If/Then/Else comparés à 1000 Switch/Case. Mais comme nous n'avons pas cette information, il reste juste à tenter de benchmarker soi-même.

Mais est-ce que ça en vaut la peine ?


Citation :
il reste juste à tenter de benchmarker soi-même.

Mais est-ce que ça en vaut la peine ?
Lol. On ne fait pas des applications qui sont dites sensibles !!! Ce ne sont que des modules pour NWN. Ne perdons pas le sens des réalités.

Perdre du temps à Benchmarker des scripts NWN ... ... à mon avis ca ne sert strictement à rien et les données qu'on pourrait éventuellement retirer, ne signifieraient rien, car trop aléatoires et trop sujettes à caution.

Le server NWN est trop mal foutu en interne pour dire que nous, scripteurs externes allons pouvoir y remédier en benchmarkant des scripts.

Si on veut vraiment optimiser un module NWN, il n'y a pas de secret, C/C++ en application déportée.

Je ne suis pas tout à fait d'accord sur ce point.

Pour reprendre l'exemple de l'artisanat, si je ne m'étais pas "amusée" à benchmarker les fonctions du CNR, j'en serais toujours à souffrir du lag qu'il provoque. Ces benchmarks m'ont permis d'opter pour l'optimisation de la plupart des fonctions CNR. Du coup, j'ai un gain de temps de *50 à *100 sur certaines fonctions. Heureusement que j'ai choisi cette option .

Cependant, comme tu dis, il ne me parait pas nécessaire de perdre du temps sur tout et n'importe quoi, par exemple le cas des switch/if ne me semble pas nécessaire à benchmarker car il est probable que les résultats ne soient pas franchement différents.

Par contre, quand on voit certains algorithmes pondus pour le CNR qui sont en O(n4) ou O(n3) et qu'il est possible de les passer sans grande difficulté en O(nlogn), là, je pense que l'optimisation est indispensable . Le benchmark est utile aussi lorsque ces mêmes algorithmes utilisent la DB externe brutalement alors qu'il est possible de passer en finesse localement...

PS @mickey : Pas eu le temps de me mettre sur les scripts de la sphère prismatique, mes mappeurs ne mappent plus ces temps-ci, j'ai donc double boulot en plus :/.
Citation :
Publié par Mickey974

...Si on veut vraiment optimiser un module NWN, il n'y a pas de secret, C/C++ en application déportée.

C'est normal que je ne comprenne rien à ce que tu écris là ?
Citation :
Publié par Heziva
Tout ce qui demande un traitement requiere une fonction. Pour simplifier, une fonction ne renvoit pas toujours une valeur en retours (on appelle processus les fonctions qui ne rendent rien.... elles rendent en fait quand meme quelque chose.)
Non une fonction qui ne renvoi rien, cela s'appel une procedure.
En fait c'est plutot le contraire. Une procedure qui renvoi qqchose s'appel une fonction. Une fonction est une procedure particuliere.
En passant c'est exactement une fonction dans le sens mathematique du terme aussi

En informatique en regle general un processus c'est un executable qui tourne, qui est actif. Sous windows XP quand tu fais CTRL-ALT-SUPP, c'est ce que tu vois dans l'onglet processus


@Sheerazade

Je suis d'accord avec l'optique que tu décris, dans la mesure ou un script qui serait écris avec "des gants de métal" doit être revu et optimisé. Là dessus on est d'accord.

Cependant, là où mon opinion diverge, c'est que le server NWN est mal fichu. Tu aura beau écrire des scripts d'enfer, hyper optimisé, que ca laggera quand même. Ca ne sera pas de ta faute ! Donc, te prends pas trop la tête avec des benchs qui te feront gagner une micro seconde !

@Azmathiel
[Mode humour on]
C'est de l'enfumage à la Mickey ! Made in Réunion ! Fait 32 ° !
[Mode humour off]

Sérieusement, comme tu n'utilises pas NWNX, c'est normal que tu ne saches peut être pas, qu'il y a possibilité de faire des pluggins pour le server NWN. C'est de cela dont je parles. Tu peux déporter les traitements courants et répétitifs du serveur vers une application autre que le server lui-même. C'est faisable et déjà fait (cf : NWNX2, FF_NWX)
Citation :
Publié par Mickey974
Je suis d'accord avec l'optique que tu décris, dans la mesure ou un script qui serait écris avec "des gants de métal" doit être revu et optimisé. Là dessus on est d'accord.

Cependant, là où mon opinion diverge, c'est que le server NWN est mal fichu. Tu aura beau écrire des scripts d'enfer, hyper optimisé, que ca laggera quand même. Ca ne sera pas de ta faute ! Donc, te prends pas trop la tête avec des benchs qui te feront gagner une micro seconde !
Ok, nous sommes d'accord alors .
Heu.........

Ben je voit que mon niveau est très bas par rapport au votre..... Pas que je me rabaisse ou fasse de la lèche mais je ne comprend pas un tiers de ce que vous expliquez.... Je bosse pas dans l'informatique moi Mais ça me serviras plus tard quand j'aurais un peu plus appris, j'espère ne pas vous donner l'impression d'avoir expliqué tout ça pour rien mais dire que j'ai tout compris serait mentir

ça devrais servir présentement à d'autres
Citation :
Mickey 974 >>-------------------> Tu peux déporter les traitements courants et répétitifs du serveur vers une application autre que le serveur lui-même. C'est faisable et déjà fait (cf : NWNX2, FF_NWX)
Cad ? Car j'utilise justement un script qui se répète toute les 20 seconde, calcul et applique 3 effets de 20 secondes chacun en même temps. D'autre part j'utilise nwn_ff, ce que tu as dit me laisse à penser que je peux optimiser ce système grâce à ff... je me trompe ? Si non comment puis-je faire ça stp ?
lol

Attention ! FF ne fera strictement rien du tout pour toi !

Citation :
Tu peux déporter les traitements courants et répétitifs du serveur vers une application autre que le server lui-même. C'est faisable et déjà fait (cf : NWNX2, FF_NWX)
Il faut bien comprendre que FF_NWNX est un exécutable qui utilise la librairie créée par Ingmar Stieger (Papillon) et par la même devient une application qui permet des traitements déportés, en l'occurrence tous les traitements vis à vis d'une base de données MySQL. FF_NWNSpeech (plus très sur du nom) est un pluggin qui vient se greffer à FF-NWNX et qui permet de traiter les saisies clavier afin d'en reconnaître certaines phrases ou certains mots (le joueur qui tape *rigole* verra son personnage rire et émettre le son du rire). Voila encore un traitement déporté. Le pluggin se sert des possibilités de liaison entre NWN Server et FF-NWNX pour faire du traitement déporté.

Donc partant de là, il faut que tu prennes tes deux mains et que tu crées ton propre pluggin. Il pourra faire ce que tu veux qu'il fasse, si tu sais coder en C/C++ ou en pascal objet (Delphi ca fonctionne aussi).

Voila, j'espère que tu comprends les horizons qu'une telle approche peut ouvrir !
Sur je cerne les possibilités déroutantes que cela peut apporter mais hélas impossible d'en profiter pour le moment car je n'ai pas les compétences pour, enfin je croit....... Disont que je ne connaît que le nwn script et encore cela approche du miracle Je vais essayer de me documenter dans ce cas

Merci
Tire la langue
comment alléger ses script :

- penser avant de coder !

- étaler simplement les données du problème (sur papier)!

- en faire un algorithme !

- vérifié que le problème est entièrement résolu.

- faire le script !

- ca marche youpi -

passer au problème suivant.


ca reste la meilleur méthode pour "pondre" des scripts déjà optimiser non !

puis comme avec toutes applications il faut se demander par quels moyens vai-je résoudre mon problème, desfois on s'embarque dans des solutions fastidieuse alors qu'une simple ligne de code aurait suffi
dans ce cas refaite un algorithme du problème !
Je rajoute une petite précision qui semblait gêner Squalthor au début, dans son post.
Les commentaires, qu'ils soient précédés de "//" ou encadrés de "/* ... */" n'affectent en rien la qualité de ton script. Ils sont tout simplement ignorés à la compilation et par conséquent, ne les gonflent en rien. On en profite pour rendre le code source plus lisible et commenter largement ce qu'on fait afin de se rappeler dans 6 mois ce qu'on voulait faire avec précision.
Alors faut en user et abuser. Ça aide largement à la maintenance après.
La seule différence sera que le script non-compilé sera un peu plus gros, mais on s'en moque, il n'est pas utilisé en jeu.

Je suppose cependant que l'on peut faire un module de 25 Mo, rien qu'avec des scripts non-compilés, ayant chacun plus de 10 000 lignes de commentaires.
Ben je me disait que plus il y avait de ligne et plus le programme devais trier pour savoir ce qu'il devais faire, si on lui balance une 60 ène de ligne entre /*...*/, forcement il les liras mais est ce que cela ne le ralentiras pas ? Je pense que, je ne suis pas programmeur donc ce n'est que des suppositions, plus un script est court et plus il sera rapide à lire et consommeras moins de ressources... Je me trompe ? A mon avis, si je me trompe pas, ça dois être plein de petits trucs comme ça qui pourrais aider à la fluidité des script
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés