La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 23/11/2024 22:50:15


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 08/04/2005 16:04:55 Sujet du message : CEP fait laguer ? ZEP_torchspawn

J'essaye de faire une métrologie sur un module persistent avant sa mise en ligne (en béta actuellement)

Voici des statistiques relevées au bout de quelques heures

Current statistics
-----------------------------------------------------------------------------------------------
x0_s0_entrshield 0 msec 2 calls | NW_S0_RayFrost 5 msec 3 calls |
zep_torchspawn 22255 msec 137904 calls | beuh 2 msec 7 calls |
>zep_onoff 35 msec 1723 calls | check_sow_duills 0 msec 3 calls |
zep_doorspawn 1660 msec 34675 calls | NW_S0_MagMiss 4 msec 4 calls |
-----------------------------------------------------------------------------------------------
Elapsed time : 10043 msec
Runtime delta : 83 msec
Total cumulative runtime : 82899 msec
Total number of scriptcalls : 316973

J'utilise nwnx2 pour etablir ces statistiques : je ne trouve pas les scripts zep_torchspawn
ni zep_doorspawn dans le module, peut-être sont-ils dans le CEP, mais j'ai souvenir de certaines difficultés à mettre des scripts en hak.
Quelqu'un connait ces scripts consommateurs de ressources ?
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Stan
Grand Chevalier
Inscrit le: 07 Avr 2005
Messages: 126
Répondre en citant
Posté le : 08/04/2005 17:04:35 Sujet du message :

Je ne suis pas sur d'avoir bien compris ta question, je te recopie les scripts en question sans les observer pour l'instant Razz

Je met tout en Spoiler car c'est assez long.

Script zep_torchspawn :
Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :

#include "zep_inc_main"

void main()
{
    int nLightCycle = GetLocalInt(OBJECT_SELF, "CEP_L_LIGHTCYCLE");
    int nInitialized = GetLocalInt(OBJECT_SELF, "CEP_L_LIGHTINITIALIZED");

    //0 if the first time this function has run for this torch, 1 if it has run before
    //used so that non-cycling placeables use less CPU time.
    if (nInitialized == 1 & nLightCycle == 0) return; //if torch is non cycling and has been initialized, quit

    int nAmIOn = GetLocalInt(OBJECT_SELF, "CEP_L_AMION");
    string sLightConst = GetLocalString(OBJECT_SELF, "CEP_L_LIGHTCONST");
    string sLightSwap = GetLocalString(OBJECT_SELF, "CEP_L_LIGHTSWAP");
    int nLight = ColorInit(sLightConst);

    if (nInitialized == 0){
        SetLocalInt(OBJECT_SELF, "CEP_L_LIGHTINITIALIZED", 1);
        SetLocalInt(OBJECT_SELF, "CEP_L_LIGHTDIURNAL", !GetIsNight());
    } //if the placeable wasn't marked as initialized, it is now.

    int nLightDiurnal = GetLocalInt(OBJECT_SELF, "CEP_L_LIGHTDIURNAL");
    SetLocalInt(OBJECT_SELF, "CEP_L_LIGHTDIURNAL", GetIsNight());
    //this gets the GetIsNight value from the last time zep_torchspawn fired
    //it is used to check to see if the torch needs to change state for day/night cycle

    if(nLightCycle == 1){ //if this is a cycling placeable
        if(GetIsNight() == nLightDiurnal) return;
        //if day/night hasn't changed since last time, return.

        if((GetIsNight() == 0)&(nAmIOn == 0)) return;
        if((GetIsNight() == 1)&(nAmIOn == 1)) return;
        //if the on/off state matches what it should be, return.

        //otherwise, destroy the placeable and place its lit/unlit counterpart at the same location
        if(nAmIOn == 1){nAmIOn = 0;}
        else {nAmIOn = 1;}

        string sResRef = GetResRef(OBJECT_SELF);
        location lLoc = GetLocation(OBJECT_SELF);

        object oNew = CreateObject(OBJECT_TYPE_PLACEABLE, sLightSwap, lLoc);
        SetLocalInt(oNew, "CEP_L_AMION", nAmIOn);
        SetLocalInt(oNew, "CEP_L_LIGHTCYCLE", nLightCycle);
        SetLocalInt(oNew, "CEP_L_LIGHTINITIALIZED", nInitialized);
        SetLocalInt(oNew, "CEP_L_LIGHTDIURNAL", GetIsNight());
        SetLocalString(oNew, "CEP_L_LIGHTCONST", sLightConst);
        SetLocalString(oNew, "CEP_L_LIGHTSWAP", sResRef);

        if (nAmIOn == 1)
        {
            effect eLight = EffectVisualEffect(nLight);
            ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLight, oNew);
        }
        DestroyObject(OBJECT_SELF, 0.0);
        return;
    }else{

        //if not a cycling placeable and uninitialized, place a light effect, if needed
        if (nAmIOn == 1)
        {
            effect eLight = EffectVisualEffect(nLight);
            ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLight, OBJECT_SELF);
        }
    }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Son commentaire :
Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
Due to various limitations in the Aurora NWN graphics engine, the switching
of light-emitting placeables is done by deleting the placeable and putting
it's lit/unlit counterpart at the same position.

Use zep_torch on a light-emitting placeable to switch it on or off.It is best
to call zep_torch from another object or script since even if the torch is made
usable, it will be replaced with a non-usable version when the on/off switch occurs.

If the color of a light-emitting placeable is changed and the change is to
be reflected in game, a zep_torchupdate must be used on the placeable.

As provided, the light-emitting placeables provided in CEP should work with
little to no builder intervention. The local variables are all set. Simply
place a lit or unlit placeable and it will take care of itself.

All light-emitting placeables in the Civilization Exterior/Lighting category
are day/night cycling by default, the rest are non-cycling. Change the value
of CEP_L_LIGHTCYCLE in the variables on your placed placeable if you wish to
change this.

Likewise, the color and radius of the emitted light can be changed on placeables
placed down in the toolset.



Le script : zep_doorspawn
Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
void main()
{
    int nIsOpen = GetIsOpen(OBJECT_SELF);
    if(nIsOpen == 1)return; //if door is open, quit
    if(GetLocalObject(OBJECT_SELF, "GateBlock") != OBJECT_INVALID) return; //if gateblock is already in place, quit
    string sGateBlock = GetLocalString(OBJECT_SELF, "CEP_L_GATEBLOCK");
    location lSelfLoc = GetLocation(OBJECT_SELF);
    object oSelf = OBJECT_SELF;
    PlayAnimation(ANIMATION_PLACEABLE_CLOSE);
    SetLocalObject(oSelf, "GateBlock", CreateObject(OBJECT_TYPE_PLACEABLE, sGateBlock, lSelfLoc));
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Le commentaire :
Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
//:Confused//////////////////////////////////////////////
//:: ZEP_DOORSPAWN.nss
//:: Copyright (c) 2001 Bioware Corp.
//:: Modified by Dan Heidel 1/14/04 for CEP
//:Confused/////////////////////////////////////////////
/*
Place in the OnHeartbeat function of a placeable door
to ensure proper functioning. See zep_openclose for
further documentation.
*/
//:Confused/////////////////////////////////////////////
//:: Created By: Brent
//:: Created On: January 2002
//:Confused/////////////////////////////////////////////



Voilà j'espere que je suis pas complétement à coté de la plaque pr ta question Very Happy

Torchspawn ça sert apparement pour tous les placeable du CEP qui émettent de la lumière la nuit et pas le jour etc...
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 10/04/2005 13:44:05 Sujet du message :

Effectivement, j'ai trouvé également ce week-end sur le forum Bioware des commentaires là-dessus, de plus ... suffit de regarder dans les haks du CEP. (je sais je sais, un peu distrait parfois)
C'est particulièrement stupide d'avoir mis du heart-beat sur des plaçables au lieu d'avoir mis une boucle générique sur le OnModuleLoad (pour les portes qui utilisent zep_doorspawn) ou même simplement sur le heart-beat (pour les lumières) de la zone où tu les utilises pour initialiser tout les plaçables avec une série de Tag particulier.
Surtout que je crois bien qu'un CEP starter module est fourni.
Ping diminué et fluidité en jeu améliorée substanciellement après avoir nettoyage presque tout ce que j'ai pu trouvé.

voilà une idée de comment faire çelà avec un heart-beat sur la zone :
1) faire un jeu de placables sans le zep_torchspawn sur le heart beat du plaçable (bah vi sinon ca remet le zep_torchspawn sur celui créé dés la prochaine nuit)
2) changer la variable du plaçable qui s'appelle CEP_L_LIGHTSWAP pour pointer sur le deuxième (pl. jour pointe vers pl. nuit et vice versa)
3) personnaliser ce script en fonction de vos besoins

NWScript :
////////////////////////////// //
//:  created by lylver 2005-04-09
//:  purpose : limiting ressource consumption
//:  from CEP pole lantern
//:  source code from CEP
//:  put on zone heart-beat (useful only when you have
//:  many placeables to handle
//:  you need to create specific night/day placeables)
////////////////////////////// //
void main()
{
  // no initialisation needed
  int nDuskDawn = GetLocalInt(OBJECT_SELF,"DAYNIGHT_STATE") ;
  int nNight = GetIsNight() ? 1 : 0 ;
  if( nDuskDawn ^ nNight ){ // bitwise XOR => testing change between two beat
      if( GetLocalInt(OBJECT_SELF,"HB_COUNT") == 2 ){

        SetLocalInt(OBJECT_SELF,"DAYNIGHT_STATE",nNight) ;
        DeleteLocalInt(OBJECT_SELF,"HB_COUNT") ;
        return ;
      }
      SetLocalInt(OBJECT_SELF,"HB_COUNT",1+GetLocalInt(OBJECT_SELF,"HB_COUNT")) ;
      object oLantern = GetFirstObjectInArea(OBJECT_SELF) ; // Note : var visibility limited
      // SendMessageToAllDMs("Dusk /Dawn : Changing light in Agatha") ;
      while( GetIsObjectValid( oLantern ) ){
        if( GetTag(oLantern) == "PLACABLE_JOUR" ||
            GetTag(oLantern) == "PLACABLE_NUIT" ){
            ExecuteScript("zep_torchspawn",oLantern);
        }
        oLantern = GetNextObjectInArea(OBJECT_SELF) ;
      }
  }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.

zep_torchspawn en lui-même peut être amélioré

seules ces 2 variables ont besoin d'être renseignées à la création du plaçable de permutation
/.../
object oNew = CreateObject(OBJECT_TYPE_PLACEABLE, sLightSwap, lLoc);
SetLocalInt(oNew, "CEP_L_LIGHTINITIALIZED", nInitialized);
SetLocalInt(oNew, "CEP_L_LIGHTDIURNAL", nLightDiurnal);
/.../
et le fichier d'include est particulièrement gros juste pour utiliser la fonction ColorInit

Voilà ou j'en suis après avoir nettoyé plus de 80% des zep_doorspawn et zep_torchspawn, vous pouvez comparez le ratio de temps déjà gagné.
/.../
zep_torchspawn 37100 msec 287631 calls *
sow_torchspawn 5173 msec 1561 calls
sow_on_hb_z0200 4140 msec 4420 calls *
zep_doorspawn 4878 msec 64890 calls *

-----------------------------------------------------------------------------------------------
Elapsed time : 10009 msec
Runtime delta : 96 msec
Total cumulative runtime : 283334 msec
Total number of scriptcalls : 920475

Il semble que ce n'est pas tant le temps d'éxécution qui fait laguer mais le nombre d'appels de scripts dans ce cas (context switching sur l'os sans doute)
Dommage qu'une idée graphique très jolie dérive comme ça une fois implémentée, j'espère que celà aidera.
Dernière édition par lylver le 14/04/2005 15:56:34; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 14/04/2005 14:27:57 Sujet du message : Initialisation des portes CEP

Voici de quoi remplacer le heart-beat des portes CEP pour l'initialisation des "Gate-Block".
Les gate-blocks servent à rendre le plaçable intraversable lorsqu'il est en position fermée, il se met correctement en place sur l'évenement de fermeture mais pas au démarrage du module.
Bien entendu, enlever le heart-beat de la porte une fois placée...
Sur le serveur où je l'ai testé, il prend 175ms sur un module avec une vingtaine de portes dispersées sur 250 zones.

NWScript :
//:Confused/////////////////////////
//:: script d'initialisation
//:: des gate-block pour remplacer
//:: le heart-beat

//:Confused/////////////////////////
void SearchCEPDOOR(string sTag)
{
  int nNbItem = 0;
  object oItem = GetObjectByTag(sTag, nNbItem++);
  object oArea;
  string sArea,sName,sTagArea;
  while( GetIsObjectValid(oItem) ) {
      oArea = GetArea(oItem) ;
      sArea = GetName(oArea) ;
      sTagArea = GetTag(oArea) ;
      WriteTimestampedLogEntry(sTag+" found in Area "+sTagArea+"-"+sArea+" : initializing");
      ExecuteScript("zep_doorspawn",oItem);
      oItem = GetObjectByTag(sTag, nNbItem++);
  }
}

void main()
{
  string sTag="ZEP_DOORS00" ;
  int i;
  for( i=1; i<=9 ; i++){
  SearchCEPDOOR(sTag+IntToString(i)) ;
  }
  sTag="ZEP_DOORS01" ;
  for( i=0; i<=1 ; i++){
  SearchCEPDOOR(sTag+IntToString(i)) ;
  }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
Page 1 sur 1 ¤


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


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 62.303ms