[script]SetLocalBoolean() ;)

Répondre
Partager Rechercher
Alors je vais rajouter ces deux fonctions au persistant des scripts, puisque je trouve que c'est vraiment une bonne idée d'Azraël que nous avons là !
Grâce à ces fonctions, et pourvu que vous stockiez beaucoup de booléen ( TRUE == 1 ou FALSE == 0 ) sur un même objet, vous pourrez économiser jusqu'à 31 local int par tranche de 32 booléens....
Gain évident de place, et donc de ressource pour votre CPU !!

Code PHP:

//Sur une idée et des fonctions originales de Azraël07
//remaniement par Jedaï

//Renvoie la valeur du bit de position nPosition du groupe sIntVarName
//oTrgObj : Objet cible par les variables
int GetBinInfo(object oTrgObjstring sIntVarNameint nPosition);

//prend un nombre et "normalise" sa longueur
string AdjustDecimal(int nNumberint nNumberOfDecimal 3);

//Attribue au bit de position nPosition du groupe sIntVarName la valeur bValue
//oTrgObj : Objet cible par les variables
void SetBinInfo(object oTrgObjstring sIntVarNameint nPositionint bValue TRUE);

string AdjustDecimal(int nNumberint nNumberOfDecimal 3)
{
    
string sNumber IntToString(nNumber);
    
int nL GetStringLength(sNumber);

    
nL nL nNumberOfDecimal;

    if (
nL<0)
        {
        
string sR "";
        for (; 
nNumberOfDecimal nNumberOfDecimal--)
            
sR += "0";
        return 
sR;
        }

    for (; 
nL nL--)
        
sNumber "0" sNumber;

    return 
sNumber;
}

void SetBinInfo(object oTrgObjstring sIntVarNameint nPositionint bValue TRUE)
{
    
int iNumber 0;
    for(; 
nPosition 32iNumber ++) nPosition -= 32;

    
string sStringName sIntVarName AdjustDecimal(iNumber);

    
iNumber << nPosition 1;

    
int nVar GetLocalInt(oTrgObjsStringName);
    
nVar bValue nVar iNumber nVar & ~iNumber;

    
SetLocalInt(oTrgObjsStringNamenVar);
}


int GetBinInfo(object oTrgObjstring sIntVarNameint nPosition)
{
    
int iNumber 0;
    for(; 
nPosition 32iNumber ++) nPosition -= 32;

    
string sStringName sIntVarName AdjustDecimal(iNumber);

    
iNumber << nPosition 1;

    
int nVar GetLocalInt(oTrgObjsStringName);

    return 
iNumber nVar TRUE FALSE;

J'aurais besoin d'une petite variante à ce système, et j'ai un doute sur la justesse de mon truc.
J'expose l'idée, j'ai défini des constantes sous forme de string dans une bibliothèque qui se présentent comme ça et bien sur, j'aimerais récupérer la valeur de mes 9 bits.
Code PHP:

string STR_GOD_ALIGN_AURILE  "010001010"
Je n'ai donc pas besoin de GetLocalInt ni de SetLocalInt par le fait et je n'ai besoin que de 9 valeurs booléennes donc j'en déduis que si je passe 9 bits au lieu de 32 ça posera pas de problèmes.
Et c'est là que je suis confronté à mes lacunes d'autodidacte, j'ai du mal à voir l'intérêt du AdjustDecimal dans mon cas.
N'irais je pas plus vite avec un GetSubString ?
Voilà si vous avez deux minutes pour me répondre

Jaha Effect
bien si tu ne dépasse pas les 32 valeurs, tu peux facilement supprimer toute la première partie du code, destiné a répartire les bits exedentaires sur de nouvelles variables
En fait je me dis que parfois je suis un peu naze car dans mon cas de figure, il est clair que GetSubString est la meilleur solution pour décomposer ma chaine.
Encore une question qui a sa réponse dans son énoncé, y'a des fois ou je me fait peur. Il faudrait que je pense à dormir un de ces quatre...

Jaha Effect
Bon, dans l'idée, c'est beau, c'est chouette, mais...
Avec un système qui tourne en 32bit, des machines puissantes, de la ram à ne plus savoir qu'en faire (bon.. presque), vous êtes convaincus que ça optimise quelque chose ? L'appel d'une fonction à la place de la création d'une variable... bon, on doit y gagner un peu, mais est-ce vraiment sur ces choses là qu'il faut optimiser ? (au prix de la lisibilité du code, en général)

Ca ne mange pas de pain et c'est plus classe de stocker une trentaine de booleans sur 4 octets plutôt 128, certes. Mais à part pour les amstrad 6128, je suis pas persuadé que ça apporte énormément.

Joli boulot, Azra et Jedaï, en tout cas. (Comme d'hab' )
Citation :
Avec un système qui tourne en 32bit, des machines puissantes, de la ram à ne plus savoir qu'en faire (bon.. presque), vous êtes convaincus que ça optimise quelque chose ? L'appel d'une fonction à la place de la création d'une variable... bon, on doit y gagner un peu, mais est-ce vraiment sur ces choses là qu'il faut optimiser ? (au prix de la lisibilité du code, en général)
Tout dépend a quelle echelle tu te place.

J'utilise ce système, par exemple, pour un système qui permet aux joueurs de gagner du savoir par la lecture des livres.

A raison d'au moins 100 bouquins prévus, ca pour chaques joueurs (disons 200 joueurs inscrit sur le module, et c'est une faible valeur), ca nous fait... 80ko pour enregistrer tout ca

ajoutons y un même système pour voir si oui ou non je joueur a déjà visité un lieu (bonus pour le joueur s'il voit la mer pour la première fois, bonus s'il voit la tour blanche de minas tirith pour la première fois, bonus s'il voit.....), disons une 100aine de lieux aussi, ca fait 80ko en plus.

Ensuite, placons nous au niveau des pnj named, pour enregistrer si oui ou non la quète à été faite ou pas, et ou en sont les relations générales avec le pnj...

A raison de 200pnj named, et au moins 4statuts par pnj(donc 2bits), ca nous fait... 320 ko

ce n'est qu'une petite partie de tout ce que je veux enregistrer de cette mannière, mais nous en sommes deja à 400ko, ce qui commence a devenir significatif (quand même 0.4mo) si on prend en compte le fait qu'il faut encore retenir de nombreuses autres valeurs, alors qu'avec ce système, pour une charge CPU suplémentaire négligeable et une complexité dans le script identique, on passe de 400ko à 12ko. Inutile d'aller bouffer les ressources pour rien, on en à largement besoin ailleur.
Clair.

Mon propos n'était pas vraiment de dire "ça sert à rien", mais plutôt qu'il ne fallait pas céder à la fièvre de l'optimisation quand l'apport est négligeable (ce qui n'est pas forcément le cas).
Tu appliques ton système de conversions binaires à une gestion des variables persistantes comme Puma et là franchement tu es heureux d'avoir une variable à la place de 32. Le tout est de se demander si l'optimisation est légitime, pour pas se retrouver avec du binaire partout même pour coder cinq malheureux booleans.
Oui, c'est sûr mais parfois c'est même plus logique de traiter un champ de booléen par référence numérique plutôt que par string, par exemple pour ma taverne, l'état des chambres (louée ou non) est stocké de cette façon sur un champ "bbChambre" avec le 1er booléen pour la première chambre, le 2ème pour la chambre n°2, etc... C'est plus lisible que si j'avais fait dix variables "bChambre1", "bChambre2", etc.. non ?
Répondre

Connectés sur ce fil

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