[RESOLU (partiellement)] éxecution de scripts sur opensim

Répondre
Partager Rechercher
Bonjour,

Je ne sais pas si je poste au bon endroit, mais bon, je tente!

Ne pouvant me connecter sur SL pour l'instant, je teste mes scripts sur une opensim, et après avoir résolu différents problèmes d'incompatibilité, il reste un big problème :

Les scripts s’arrêtent au bout d'un moment !

Il s'agit d'une boucle sans fin, qui marche très bien sur la grille SL, mais sous opensim elle ne fait plus rien au delà de 3 ou 4 tours de boucle.

J'ai posté sur divers forums dédiés à opensim, mais sans solutions pour l'instant. Je poste donc ici au cas où un scripteur aurait rencontré le même problème.
non pas tout de suite
le script fonctionne bien sur la grille SL de toute façon.

je compte bien le donner (sur Jol tant qu'à faire), mais c'est du lourd (ben wi, je fais pas dans le light ) et j'en profiterai ptet pour relancer les concours de scripts, ça fait longtemps... (mais cette fois sans avoir besoin d'écrire un script pour gagner..., je posterai le concours bientôt...) + ensuite explication du machin... bon si y a du monde que ça intéresse...

pour l'instant ce qui m’embête c'est l’arrêt des scripts sous opensim...
peut etre l appel à une fonction non implémentée sur opensim ?

t as pas la stack trace de la machine virtuelle mono qui s affiche dans le debug channel ?

comment est le statut du script apres l arret ? faut il resetter a nouveau le script ?

et en sortie de boucle il y a quelque chose dans ton scripts de codé ? ca l execute ou non ?

il y a des jump ou des state dans ta boucle ?
salut à toi RedPurple l'insomniaque

Toutes les fonctions sont compatibles, car tout le code de la boucle est exécuté sur les 3 ou 4 premiers tours.
Le script est toujours en train de tourner, car il n'y a pas de messages d'erreurs, mais il ne fait plus rien.
Le script ne fait vraiment plus rien, comme figé, j'ai mis des llSayOwner partout pour vérifier. Et je n'ai rien de bizarre dans la console côté serveur, ni rien dans les messages d'erreur de script.

Oui il y a des état, mais ca marche bien. Il y a juste un premier état d'initialisation et ensuite on passe à l'état qui exécute la boucle infinie. Mais pas de changement d'état dans la boucle.

Je suis pour l'instant sur la piste des jumps, je suppose que ça empile des accolades et que les jump empêchent de dépiler les accolades fermantes. Ce n'est qu'une supposition après avoir remarqué que sous opensim il faut ajouter des accolades normalement inutiles (quand on n'a qu'une seule instruction après un if par exemple).
Je sais bien que les jumps c'est le mal! , mais ça me permettait d'éviter un long empilement de "else if". J'espère que la (longue) réécriture sans jump ne provoquera pas trop d'imbrications de code (il y a une limite je crois)
Je ne cherche pas à jouer aux devinettes sur ce post.

Le script est trop gros pour être posté ici (100Ko répartis sur 2 scripts).

Ce que j'espérai en créant ce post, c'est que quelqu'un connaisse la différence entre SL et opensim qui me pose problème, ou alors connaisse le bon paramétrage à faire dans opensim.ini

Je n'ai rien trouvé sur le net (même chez opensim, ou osgrid, j'ai posté la bas en premier). C'est dommage qu'il n'y ai pas une endroit ou se trouveraient réunies toutes les différences de script entre la version "officielle" et le moteur d'opensim (XEngine)


Le jeu de la devinette, ça sera un autre sujet à venir...
Tu peux mettre ton script en fichier joint ou bien publier des extraits si c'est secret ... mais sans rien tu n'auras que des suppositions hésitantes, des tentatives au jeu des devinettes, ... Moi entre autres je suis bien là pour t'aider, je le ferai bien volontiers mais il faut aussi jouer le jeu un minimum, on est pas marabou
Je comprend bien Ahuri, mais pour l'instant ce que je cherche c'est à comprendre la différence de comportement entre les deux moteurs d’exécution de script.

Le script en lui même ne pose aucun problème, il tourne bien sur SL.

Ceci dit voici un exemple très simple qui reproduit le problème :

Code PHP:

integer x 1;

default
{
    
state_entry()
    {
        while(
TRUE
        {
            
llSetText((string)x, <1.0,0.0,0.0>, 1.0);
            
x++;
        }
     }

quand le compteur arrive à 88048, il ne se passe plus rien.
Je n'ai aucun message d'erreur de script, il est toujours à l'état "running"
(du coup j'abandonne l'hypothèse des jumps car il n'y en a pas ici)

par contre j'ai ceci dans la console opensim :

2011-08-12 10:46:47,718 DEBUG - OpenSim.Region.ScriptEngine.XEngine.XEngine [XEngine] Loaded script Primitive.New Script, script UUID 6f8c1dff-08c6-451c-96da-ec7646077d7a, prim UUID 5e85a953-6347-4366-b33f-a503176825c4 @ <162.4728, 63.33913, 22.22694>.TEST00
2011-08-12 10:46:48,515 INFO - OpenSim.Framework.Servers.HttpServer.BaseHttpServer [BASE HTTP SERVER]: slow POST request for /CAPS/2b5aef4a-258a-470f-a600-b02744e1a4cf6197 from 192.168.0.2:2308 took 19453 ms

Mais j'ignore totalement si ce "slow post request" est lié à l'arret du script

edit:
si je rajoute un llSleep(0.01); dans la boucle, ca s'arrete à 2205, en mettant le llSleep en commentaire, ca tourne jusqu'à 580977 !!!
super bizarre, un bug en mémoire?
Avec ce script et ta description je vois bien le problème maintenant.

C'est de toute évidence un problème lié à la facon dont sont implémentés les scripts sur ta version d'Opensim.

1) Essaie de voir si ta version d'Opensim est à jour, si non faut faire l'update, si oui :
2) Laisse un ticket ou un mail aux développeurs de ton Opensim.
3) Opensim n'est toujours pas une plateforme stable, il faudra attendre que le problème soit "patché" par la dev team.

Je ne vois aucun moyen d'action pour toi ... a part si le fichier ini permet de choisir un moteur de script plutôt qu'un autre, j'en doute.
Ben voila, ce que tu dis c'est exactement le point ou j'en suis.

j'ai bien la dernière version : 0.7.1.1
Il n'y a qu'un moteur : XEngine

J'ai posté un bug sur opensimulator.org

C'est dommage, c'était bien pratique pour tester sans lag, toussa...
<mode jracontemalife>
m'enfin, après déménagement RL, ma box devrait arriver aujourd'hui, je vais bientôt pouvoir me reconnecter sur la grille SL, parcequ'en hotspot wifi c'est juste l'enfer!
</mode jracontemalife>
Bizarre: je viens de tester sur mon opensim 7.2 (osgrid); ça a calé effectivement mais à 7 670 598

J'ai rajouté un touch avec un llOwnerSay: ça cale un peu plus tot (dans les 6 millions 5) et une fois la boucle calée le touch réagit et fonctionne à volonté. Le script n'est pas mort mais la boucle a été abandonnée.

C'est grave si on ne peut pas utilisé les boucles infinies sur opensim.
A mon avis ce n est pas un bug mais une feature

Dans le fichier de config opensim.ini , il y a un paramètre qui donne le temps maximum dans lequel on peut rester dans un evenement .
C est pour cela qu elenia a un résultat différent du tien puisque son processeur doit etre un peu plus rapide , et qu en rajoutant des sleeps cela interrompt la boucle plus tot ( pas en temps qui reste constant , mais en nombre d itérations

Je tele mets en gras , c est le paramètre EventLimit
Par défaut il est positionné à 30 secondes .
En faisant des tests , il semble que le script continue quand meme 3-4 secondes apres ce paramètre
( en le mettant à 3 , ton script s arrete au bout de 6-7 secondes , en le laissant a 30 il s arrete au bout de 33-34 secondes, en le mettant a 0 , il sarrete au bout de 3 secondes )

Remplace ton script par
Code PHP:

integer x 1;
default
{
    
state_entry()
    {
        
x=1;
        
llResetTime();
        while(
TRUE
        {
             
llSetText((string)llGetTime(), <1.0,.0,.0>, 1.0);
            
x++;
        }
     }

pour vérifier si mon analyse est correcte

Si c est le cas , pour tes besoins , fais une sauvegarde de ton fichier opensim.ini , change le paramètre eventlimit que je t ai mentionné dans ton fichier opensim.ini , redémarre le serveur opensim

Code PHP:

[XEngine]
    ; 
Enable this engine in this OpenSim instance
    Enabled 
true
    
How many threads to keep alive even if nothing is happening
    MinThreads 
2
    
How many threads to start at maximum load
    MaxThreads 
100
    
Time a thread must be idle (in secondsbefore it dies
    IdleTimeout 
60
    
Thread priority ("Lowest""BelowNormal""Normal""AboveNormal""Highest")
    
Priority "BelowNormal"
    
Maximum number of events to queue for a script (excluding timers)
    
MaxScriptEventQueue 300
    
Stack size per thread created
    ThreadStackSize 
262144
    
Set this to true (the default) to load each script into a separate
    
AppDomainSetting this to false will load all script assemblies into the
    
current AppDomainwhich will reduce the per-script overhead at the
    
expense of reduced security and the inability to garbage collect the
    
script assemblies
    AppDomainLoading 
true
    
Rate to poll for asynchronous command replies (ms)
    ; 
currently unused
    
;AsyncLLCommandLoopms 50
    
Save the source of all compiled scripts
    WriteScriptSourceToDebugFile 
false
    
; Default language for scripts
    DefaultCompileLanguage 
lsl
    
; List of allowed languages (lsl,vb,js,cs)
    ; 
AllowedCompilers=lsl,cs,js,vb.
    ; *
warning*, non lsl languages have access to static methods such as System.IO.File.  Enable at your own risk.
    
AllowedCompilers=lsl
    
Compile debug info (line numbersinto the script assemblies
    CompileWithDebugInformation 
true
    
Allow the user of modfunctions.  This allows a script to pass messages
    
to a region module via the modSendCommand() function
    ; Default 
is false
    AllowMODFunctions 
false
    
Allow the use of osfunctions (some are dangerous)
    
AllowOSFunctions false
 
    
Allow the user of LightShare functions
    AllowLightShareFunctions 
false
    
Threat level to allowone of NoneVeryLowLowModerateHighVeryHighSevere
    OSFunctionThreatLevel 
VeryLow
    
Interval (sbetween background save of script states
    SaveInterval 
120
    
Interval (sbetween maintenance runs (disable)
    
MaintenanceInterval 10
    
Time a script can spend in an event handler before it is interrupted
    EventLimit 
30
    
; If a script overruns it's event limit, kill the script?
    KillTimedOutScripts = false
    ; Sets the multiplier for the scripting delays
    ScriptDelayFactor = 1.0
    ; The factor the 10 m distances llimits are multiplied by
    ScriptDistanceLimitFactor = 1.0
    ; Maximum length of notecard line read
    ; Increasing this to large values potentially opens
    ; up the system to malicious scripters
    ; NotecardLineReadCharsMax = 255
    ; Sensor settings
    SensorMaxRange = 96.0
    SensorMaxResults = 16
    ; OS Functions enable/disable
    ; For each function, you can add one line, as shown
    ; The default for all functions allows them if below threat level
    ; true allows the use of the function unconditionally
    ; Allow_osSetRegionWaterHeight = true
    ; false disables the function completely
    ; Allow_osSetRegionWaterHeight = false
    ; Comma separated list of UUIDS allows the function for that list of UUIDS
    ; Allow_osSetRegionWaterHeight = 888760cb-a3cf-43ac-8ea4-8732fd3ee2bb
    ; You can also use script creators as the uuid
    ; Creators_osSetRegionWaterHeight = <uuid>, ...
    ; If both Allow_ and Creators_ are given, effective permissions
    ; are the union of the two.
    ; Allow for llCreateLink and llBreakLink to work without asking for permission
    ; only enable this in a trusted environment otherwise you may be subject to hijacking
    ; AutomaticLinkPermission = false
    ; Disable underground movement of prims (default true); set to
    ; false to allow script controlled underground positioning of
    ; prims
    ; DisableUndergroundMovement = true 
**edit*
je ne sais pas ce que cela donne en mettant en commentaire la ligne au lieu de mettre une valeur arbitraire . Peut etre que cela definit à 0 ou peut etre que cela désactive cette limitation .
De toute facon , si tu n utilises pas opensim pour d autres personnes , tu peux le positionner à un jour complet 86400
C est découragé en revanche si tu utilises opensim à des fins de serveurs , si tu regardes tes ressources CPU elles seront prises à 100% sur au moins un CPU . Apparament à ce que j ai compris sur le net , ils parlent d un autre engine de script ( XMREngine ) qui permettrait d etre un peu plus intelligent et de faire diminuer la priorité des scripts qui restent trop longtemps dans le meme evenement afin de laisser plus de temps CPU à la sim pour d autres scripts , evenements du monde etc ..
Note que même sur second life , ce est pas génial de rester sur le même evenement sans donner la main de temps en temps au gestionnaire d évènements . Tes evenements rentrants vont s empiler et vont saturer la pile d evenements ; tu avs donc perdre des evenements à gèrer . De plus apparament , en faisant quelques tests , j ai l impression que second life fait de même que ce que devrait faire XMREngine : il abaisse la priorité su script jusqu à le faire tourner très très lentement
Resolu
Ha ben voila,

Bravo RedPurple, tu es allé plus loin que moi avec le paramètre EventLimit !

Je l'avais positionné à 0, espérant le rendre infini... alors qu'une grande valeur comme tu dis est largement suffisante pour mes tests!

Une autre remarque, très étonnante : je pensais rester en local avec une opensim.
Déjà que pour que le viewer (Phoenix) veuille bien te connecter, il faut être connecté à internet! du coup pas d'utilisation purement locale...
De plus, maintenant que j'ai reçu et installé ma box (sauf que free m'a envoyé une V5 au lieu de la V6!! grrrr), ma connection est beaucoup plus rapide qu'en wifi.
Et ce que je constate, c'est que les scripts vont 100 fois plus vite !!!!!

Bon c'est bizarre, mais je peux vivre avec ça, mon problème est résolu
Citation :
Publié par Barbidule McBride
Ha ben voila,

Bravo RedPurple, tu es allé plus loin que moi avec le paramètre EventLimit !

Je l'avais positionné à 0, espérant le rendre infini... alors qu'une grande valeur comme tu dis est largement suffisante pour mes tests!

Une autre remarque, très étonnante : je pensais rester en local avec une opensim.
Déjà que pour que le viewer (Phoenix) veuille bien te connecter, il faut être connecté à internet! du coup pas d'utilisation purement locale...
De plus, maintenant que j'ai reçu et installé ma box (sauf que free m'a envoyé une V5 au lieu de la V6!! grrrr), ma connection est beaucoup plus rapide qu'en wifi.
Et ce que je constate, c'est que les scripts vont 100 fois plus vite !!!!!

Bon c'est bizarre, mais je peux vivre avec ça, mon problème est résolu

Tu peux même aller à la vitesse de la lumière en réduisant les délais des fonctions standarts (du style llemail etc )
; Sets the multiplier for the scripting delays
ScriptDelayFactor = 1.0
Réduis le par exemple à 0.1 pour voir tes délais se réduire ( une fonction avec 20 secondes de délai passera à 2 , une fonction avec 3 secondes de délai passera à 0.3 etc ..) . Attention à garder à l esprit que lorsque tu porteras ton script sur second life il peut y avoir des soucis ( synchronisation , etc )
Fouille les autres paramètres pour voir ce qui peut t intéresser : ; ceratins sont désactivés parce qu ils ne fonctionnent pas correctement d autres parce que c est pour avoir une config stable par défaut . Mais il y a de quoi s amuser en rechangeant à ta sauce
Haaa, merci, très intéressant comme paramètre

j'avais noté le AppDomainLoading = false qui booste pas mal les perfs (si on oublie les problèmes potentiels de sécurité cités, mais bon, tant qu'on reste en local...)

je ferai joujou avec celui là aussi, merci RedPurple


Puisqu'il y a des neurones connectés en ce mois d’Août, je m'en vais vous poster un ptit concours, ça me manquait depuis 8 mois d'absence...

PS : comment mettre [RÉSOLU] ou [PRATIQUEMENT RÉSOLU] dans le sujet ?
Citation :
Publié par Barbidule McBride
PS : comment mettre [RÉSOLU] ou [PRATIQUEMENT RÉSOLU] dans le sujet ?
Ca je peux y répondre

Tout en cliquant sur ton premier post "modifier" > aller en mode avancé et ajouter ce que tu veut dans le titre

Chui une quiche en script mais en forum je roxe du poney!!
Répondre

Connectés sur ce fil

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