Alléger les script.

Répondre
Partager Rechercher

[Mode humour on]
Le meilleur script du monde le plus puissant et le plus allégé est celui-ci :

Code PHP:

void main()
{

[Mode humour off]

Ceci dit, , plus tu scripts plus tu utilises le temps processeur.

Donc à partir de là, il y a quelques trucs que tu peux faire pour éviter les lourdeurs.

1 - Préférer les switch case au if else
2 - Eviter des boucles - Privilégier le while au for
3 - N'utiliser la récursivité qu'en toute dernière extrémité
4 - Déclarer correctement ses variables, les utiliser, et ensuite les détruire
5 - Eviter les boucles insolvables (le compilateur te prévient en général sauf dans des cas particuliers)
6 - Privilégier le code générique et réutilisable
7 - Utiliser le modèle objet
8 - Privilégier les bibliothèques que des scripts éparpillés
9 - Une fonction = un besoin

Voila, il y en a bien d'autres.
modèle objet ?

Hé bien ce langage de script est dérivé du C/C++, donc forcément il en reprend la philosophie. Or le C/C++ c'est un langage qui est bâtit autour du modèle objet (surtout le C++ et le C#). Donc faut tenter d'appliquer toute la philosophie qui a trait à ce langage (héritage,polymorphysme,transtypage,casting,pointeur,prototypage etc etc). Je dis bien tenter ! Car le langage de script d'aurora ne peut sûrement pas être comparé à son ancêtre, mais on peut tout de même arriver à faire certaine chose sympa malgré tout !
euh Mickey j'ai beau chercher je ne vois strictement rien d'objet dans ce langage
Ah si on appel des objets mais c'est bien tout.

Le polymorphisme, n'existe pas, l'heritage non plus, et moi un truc qui m'embete plus qui n'existe pas c'est la surcharge...

Ne vous trompez pas, le NWNScript ressemble pas au C ou en tout cas il y ressemble comme le Pascal... la seule chose qui y ressemble c'est la syntaxe et le fait que l'on ecrit #include ... en haut, le fait que la fonction principal s'appel void main() ... mais c'est bien tout.
Pas de tableau, pas de pointeur... que du passage de parametre par valeur...

Citation :
Donc à partir de là, il y a quelques trucs que tu peux faire pour éviter les lourdeurs.

1 - Préférer les switch case au if else
2 - Eviter des boucles - Privilégier le while au for
3 - N'utiliser la récursivité qu'en toute dernière extrémité
4 - Déclarer correctement ses variables, les utiliser, et ensuite les détruire
5 - Eviter les boucles insolvables (le compilateur te prévient en général sauf dans des cas particuliers)
6 - Privilégier le code générique et réutilisable
7 - Utiliser le modèle objet
8 - Privilégier les bibliothèques que des scripts éparpillés
9 - Une fonction = un besoin
ok pour 1, 3, 4, 5, 6, 9

Pour le 2 j'aurais tendace a dire le contraire, preferer le for au while... mais pour etre sur il faudrait voir ce que fait le compilo... (en tout cas en C je te dirais directement qu'il faut preferer le for surtout si tu connais la limite haute au moment de la compilation... for (i=0; 5>i; i++) par exemple là les derniers compilo c ne font pas de boucle mais recopie le code a l'interieure de la boucle 5 fois )

et pour le 8 faut faire attention, car ce qui est mis en include est enfait plus ou moins copier dans ton source. L'include ressemble plus a un COPY cobol
Ce qui fait quelorsque tu as des grosses libraries tu finis par avoir de gros fichier ncs.
Pour exemple il suffit de rechercher le lvl d'un PJ. Si tu fais un script an utilisant GetCharacterLevel() tu vas sacrement voir la difference avec un script ou tu utilise GetHitDice()...
Donc des librairies oui car cela est fait pour maintenir plus facilement. Mais il faut faire des librairies avec une unite 'fonctionnel' precise.

Au niveau des variables etc... lorsque vous appelez plus d'une fois la meme fonction qui a un type de retour donne, avec des parametres identiques. Ben affectez la a une variable pour ne l'appelz qu'une seule et unique fois.
exemple :
Code PHP:

void main()
{
....
   if (
GetHitDice(oPC)>0)
   {

    ....
    }

...

   if (
GetHitDice(oPC) > 5)
...


il vaut mieux ecrire
Code PHP:

void main()
{
...
int iLevel GetHitDice(oPC);

if (
iLevel 0)
...

if(
iLevel 5)
...

A contrario si vous utilisez qu'une fois ca sert a rien...

Un autre truc le Wizard pour le StartingConditionnal eviter le...
D'abord parce qu'il pense en negatif ce qui est relativement chiant a lire (enfin pour moi qui pense en positif ) et ensuite parce qu'il fait vraiement n'importe quoi des qu'il y a plusieurs condition... il ne connait pas a priori l'usage du OR (||) ni du AND (&&)
Le langage C n'est pas bâti autour du modèle objet... Ce n'est pas un langage objet. La vrai puissance du C vient des pointeurs (l'art de faire mumuse avec des adresses mémoires pour vraiment simplifier).
Le C++ est une amélioration (sacré amélioration) du C. Car lui a été conçu dans cette perspective. Donc nous avons un langage très très puissant car il couple l'objet au pointeur.

NWScript est un dérivée du C++, en effet.
De ce fait, on a un langage de programmation qui a une connotation de script. C'est à dire un langage simplifié est ayant des fonctionnalités en moins (tout comme JAVA / Javascript).
NWScript utilise les objets mais pas les pointeurs... Les objets sont tous déjà définis et suivent un modèle suivant leur famille (placeable, creature...). Et il nous met à disposition des fonctions comme "CreateObject..."/"GetLocal..." et j'en passe... le site nwnlexicon en ai truffé.

Voilà pour la petite mise au point. * C un langage objet, non mais *
@PinMaster

Citation :
Voilà pour la petite mise au point. * C un langage objet, non mais *
lis !

Citation :
Hé bien ce langage de script est dérivé du C/C++, donc forcément il en reprend la philosophie. Or le C/C++ c'est un langage qui est bâtit autour du modèle objet (surtout le C++ et le C#).
@Garrath

Citation :
euh Mickey j'ai beau chercher je ne vois strictement rien d'objet dans ce langage
Je n'ai pas parler d'objet mais de modèle objet.

Citation :
Le polymorphisme, n'existe pas, l'heritage non plus, et moi un truc qui m'embete plus qui n'existe pas c'est la surcharge...Ne vous trompez pas, le NWNScript ressemble pas au C ou en tout cas il y ressemble comme le Pascal... la seule chose qui y ressemble c'est la syntaxe et le fait que l'on ecrit #include ... en haut, le fait que la fonction principal s'appel void main() ... mais c'est bien tout.
Oui. sauf que j'ai bien préciser :

Citation :
Donc faut tenter d'appliquer toute la philosophie qui a trait à ce langage (héritage,polymorphysme,transtypage,casting,pointeur,prototypage etc etc). Je dis bien tenter !
Citation :
Publié par PinMaster
NWScript est un dérivée du C++, en effet.
De ce fait, on a un langage de programmation qui a une connotation de script. C'est à dire un langage simplifié est ayant des fonctionnalités en moins (tout comme JAVA / Javascript).
NWScript utilise les objets mais pas les pointeurs... Les objets sont tous déjà définis et suivent un modèle suivant leur famille (placeable, creature...). Et il nous met à disposition des fonctions comme "CreateObject..."/"GetLocal..." et j'en passe... le site nwnlexicon en ai truffé.

Voilà pour la petite mise au point. * C un langage objet, non mais *
NWScript n'est pas objet!!!!!
Arreter de confondre langage oriente objet avec utilisation d'objet.
D'ailleurs comme tu le dis toi meme au dessus il met disposition des fonctions... et non des methodes!!!!
NWN est tres certainement ecrit en objet, c'est sur. Ce que permet NWScript c'est juste l'acces a des attributs de ces objets. Meme dans la syntaxe on reste procedural.
Quand tu veux fermer une porte tu fais bien un SetLocked(oDoor, TRUE). La c'est du procedural. On serait en objet on ecrirait oDoor.SetLocked(TRUE). Et ce n'est pas qu'un simple pb de syntaxe, conceptuellement c'est different.
Avec SetLocked(oDoor, True) on lance une fonction qui ferme la porte, en objet et avec oDoor.SetLocked(True) on demande a la porte d'effectuer l'action de se fermer, c'est l'objet qui se ferme (y a une nuance conceptuel... le resultat final est le meme la porte est fermée ).
Le NWScript est par contre un langage simplifie, je sais pas pourquoi on il s'appel script d'ailleurs car en general le script indique un langage non compilé, et on peut dire qu'il est evenementiel aussi... ce qui peut etre assez interressant... mais ce qui est dommage c'est qu'il ne gere pas d'exception...
Exemple con dans un thread un peu plus bas quelqu'un demande comment empecher un PJ qui n'est pas de la classe X a ouvrir une porte.
Ben normalement en evenemetiel avec une gestion des exceptions on aurait juste fait un code du style (sur l'evenement UnLock):
Code PHP:

void main()
{
...
if (
GetClassByPosition(1oPC) != CLASS_TYPE_DRUID)
{
 
envoi d'une exception... 
}


Alors que la ben il faut refermer la porte... au final la porte qu'un PJ n'a pas le droit d'ouvrir il l'ouvre quand meme mais il la referme derriere...
Citation :
NWScript n'est pas objet!!!!!
Oui.

Pour ouvrir un peu le débat, sur le point 7, je pensais surtout aux extensions de langage. Tout le monde connaît NWNX. Tout le monde sait que l'on peut y greffer des plugins. On peut même simplement utiliser la librairie MadCodeHookLib (plus très sur du nom) et bâtir une nouvelle extension (FF-NWNX, PUMA). Ce que j'ai fait également.

Dès lors rien n'empêche de faire des extensions de langage et simplifier la vie du server en déportant les traitements. Je pensais surtout à ses extensions lorsque je parlais de modèle objet.
Splendide ton speech Garrath

J'ai bien dit que NWScript utilisait des objets mais jamais dit que c'était un langage orienté objet. Bref, il m'arrive de ne pas être très clair dans mes explications, donc désolé.
Côté langage objet, je pense que je n'ai rien à t'apprendre. En fait, ce serais plutôt l'inverse même si j'en ai déjà fait mais bon après faud pratiquer et ce n'est pas mon cas.
Sinon je voix plus NWScript comme un langage ressemblant à du VisualBasic (le VB3, le reste doit être quasi pareil). Mais bon chacun à sa vision.

Pour l'appellation Script, je pense que c'est surtout lié au fait que ce langage ce veut accécible à une grande majorité d'individu.
ah la par contre j'avoue que je suis tres loin de pouvoir faire ca Mickey... (utilisation de MadCodeHookLib)

Par contre Pin non t'inquietes pas je suis pas un pro de l'objet je suis surtout un bon programmeur C. Mais j'ai surtout fait de l'objet a la fac et en cours du soir...
J'ai surtout l'experience de nombre de projet sur des langages objets ou au final les seuls objets que l'on utilisait etait les objets graphiques... les tres nombreux projets d'info de gestion du milieux des annes 90...
Mais l'objet est un truc qui m'interresse car c'est un truc conceptuellement interressant vu qu'il faut penser differement et surtout c'est un truc de paresseux (une fois que c'est bien reflechi) et en tant qu'informaticien c'est ca qui me plait... bien reflechir avant pour avoir un minimum de taf apres... et les design pattern aussi me font kiffer...
C'est pas très compliqué Garrath. Et je suis sur que tu pourrais le faire, vu que tu connais le C. Pas besoin de C++ (C'est mieux certes). Il suffit juste de prendre le .lib (madcodehooklib) fournit par le source de NWNX et le linker dans ton projet C. Tu fais les liaisons avec cette librairie et ensuite à toi de bâtir tes extensions. Dès lors, tu peux déployer la puissance du C, du C++.

Comme le sujet initial poster par Squaltor était :

Alléger les scripts

je crois que c'est une excellente méthode pour non seulement alléger les scripts mais également alléger la charge de calcul du serveur pour des opérations répétitives dans les scripts. A mon avis, c'est infiniment plus rapide lorsque c'est traité par un exec que par le server lui-même, surtout si il y a des joueurs.

D'autre part, on peut y rajouter des fonctionnalités non permises par le langage de NWN et profiter de la souplesse, la puissance du C/C++. Un exemple pour illustrer ce que je raconte, c'est la fonctionnalité de calcul d'heure de l'extension FF-NWNX.

hum... interressant...
Je m'y pencherais quand j'aurais le temps... c-a-d deja quand le module sera enligne et que j 'aurais totalement depilé tout ce que l'on veut faire ...
He ben, merci pour toutes ces réponses... je n'en attendais pas tant
J'avoue avoir assez mal à la tête car c'est beaucoup d'infos à prendre en compte et à mémoriser mais je pense qu'après quelques heures entre chaque retour sur ce post ça devrais aller Pas évident de scripter dites lol, surtout pour les pauvres débutants scripteurs comme moi qui n'ont strictement fais aucunes études dans la programmation mais en regardant vos commentaires, script et autres j'ai pût commencer à faire quelques script perso Ce post, j'ose l'espérer, devrais aider pas mal de monde qui ne sont pas sûr à 100% de ce qu'ils font

En tout cas >>--------> merci pour tout
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 )
Petit commentaire à ajouter (à confirmer, bien sûr) :

Le switch/case est beaucoup plus utile pour des vérifications simples.

Le if/else if est beaucoup plus paramétrable.
Le switch case comme dit au dessus ne se fait que sur des valeurs entieres donc focement il ne se fait que sur des choses simples... On ne peut pas y mettre de && ou de || donc (quoique on pourrait mais ca ne laisserait que 2 case de toutes façons comme un if else ), il ne se fait que sur la valeur d'un parametre.

Citation :
Mickey 974 >>------------> Préférer les switch case au if else
C'est plutot dans la mesure du possible... car c'est pas tout le temps possibles... Mais lorsque c'est possible, il faut le faire.
Pour l'intérêt du switch/case par rapport au if/then/else, je reste dubitative. Quelqu'un a-t-il concrètement fait des benchmarks ?

Je pense que tout dépend de comment est fichu le compilateur et de quelle manière il optimise les switch/case, s'il les optimise.
D'après ce que j'ai lu, et en ayant commencé à les utiliser, les switch case marche sur les constantes.

Pour répondre a squaltor, un swith case est plus interessant qu'un if quand la condition a vérifier ne se produit qu'une seule fois, mais que le résultat peux être différent.

Au lieux d'ecrire :
int n = Random (4)

if (n = 1)
{....}
if (n = 2)
{...}

tu écrit

switch (n)
{
case 1 : ...
break;
case 2 : ...
break;
etc.
}

Ou pour être plus clair :
au lieux de faire :
int nRace = GetRace (oPC)
if (nRace = RACE_TYPE_HUMAN)
{...
if (nRace = RACE_TYPE_ELF
{...
etc.

Tu fais
int nRace = GetRace(oPC)
switch (nRace)
{
case RACE_TYPE_HUMAN: ...
break;
case RACE_TYPE_ELF: ...
break;
etc.
}
et en métant comme dernier "case"
constant:...

ca fait la meme chose que le else.
Disons que :
Code PHP:

int nRace GetRacialType(... ...);
if(
nRace==RACIAL_TYPE_HUMAN || nRace==RACIAL_TYPE_HALFELF || nRace==RACIAL_TYPE_HALFORC)
{
    ... ...
}
else if(
nRace==RACIAL_TYPE_HALFLING || nRace==RACIAL_TYPE_GNOME)
{
    ... ...
}
else if(
nRace==RACIAL_TYPE_ELF)
{
    ... ...
}
else if(
nRace==RACIAL_TYPE_DWARF)
{
    ... ...

Pourra être remplacé par :
Code PHP:

int nRace GetRacialType(... ...);
switch(
nRace)
{
    case 
RACIAL_TYPE_HUMAN   :
    case 
RACIAL_TYPE_HALFELF :
    case 
RACIAL_TYPE_HALFORC :
    {
        ... ...
        break;
    }
    case 
RACIAL_TYPE_HALFLING :
    case 
RACIAL_TYPE_GNOME    :
    {
        ... ...
        break;
    }
    case 
RACIAL_TYPE_ELF :
    {
        ... ...
        break;
    }
    case 
RACIAL_TYPE_DWARF :
    {
        ... ...
        break;
    }

C'est le seul cas, à ma connaissance, où switch/case peut remplacer if/else if incluant "||".
Répondre

Connectés sur ce fil

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