New Region Modules/fr
From OpenSimulator
Languages: |
English Français |
Contents |
Pourquoi
L'API du système RegionModule actuel est en partie incohérente et ne prend pas vraiment en charge les redémarrages de régions et l'ajout/suppression de régions à la volée pendant l'exécution du serveur de régions.
Par exemple, l'API indique que Initialise est appelé pour chaque région (dans chaque module de région), puis que PostInitialise est appelé pour chaque module de région. Lorsqu'une nouvelle région est ajoutée, que doit-il se passer ?
- Ne pas appeler Initialise : Le module-région n'est pas initialisé pour cette région, ce qui conduit à des fonctionnalités manquantes.
- Appeler Initialise : Alors PostInitialise a été appelé trop tôt. En fait, PostInitialise ne peut pas être appelé du tout, car vous pouvez ajouter une région après cela à tout moment.
Que doit-il se passer si une région est redémarrée ? Que doit-il se passer si une région est supprimée ?
Quoi
Le nouveau système région-module est basé sur trois interfaces :
ISharedRegionModule, INonSharedRegionModule et IRegionModuleBase, qui est l'interface de base pour les deux autres.
public interface IRegionModuleBase { string Name { get; } void Initialise(IConfigSource source); void Close(); void AddRegion(Scene scene); void RegionLoaded(Scene scene); void RemoveRegion(Scene scene); }
public interface ISharedRegionModule : IRegionModuleBase { void PostInitialise(); }
public interface INonSharedRegionModule : IRegionModuleBase { }
- Le chargement des classes des modules régionaux se fait via Mono.Addins au démarrage du serveur.
- L'instanciation des modules régionaux se fait...
- pour ISharedRegionModule une fois après le chargement (au démarrage du serveur)
- pour les INonSharedRegionModule après la création de l'objet Scene.
- Vous pouvez faire un nettoyage lorsqu'une région est supprimée.
- Vous pouvez nettoyer avant que le serveur ne s'éteigne.
- Note
- Un PostInitialise pour un INonSharedRegionModule n'a pas beaucoup de sens, car nous n'avons pas de point précis à partir duquel nous n'appellerons plus Initialise sur un INonSharedRegionModule. Chaque fois qu'une nouvelle région est ajoutée (ainsi qu'au redémarrage), une nouvelle instance est créée et Initialise est appelée sur cette instance, donc la sémantique prévue de PostInitialise ne s'appliquera jamais.
Details
Création d'un assembly de module de région
Inclure
using Mono.Addins;
dans votre fichier. Vous devrez inclure Mono.Addins.dll dans votre projet.
Vous devrez ensuite ajouter plusieurs attributs à votre assembly et aux classes d'extension de l'assembly pour que Mono.Addins reconnaisse le fichier .dll comme contenant des addins valides.
Placez ce qui suit n'importe où dans votre bibliothèque, juste au-dessus de la déclaration d'espace de nom dans l'un des fichiers. Ceci doit être inclus dans un seul fichier de votre dll.
[assembly : Addin("MyAddin", "0.1")] [assembly : AddinDependency("OpenSim", "0.5")]
Pour chaque classe RegionModule, utilisez l'attribut, juste au-dessus de sa déclaration :
[Extension(Path="/OpenSim/RegionModules",NodeName="RegionModule")]
Notez que la directive Addin est la seule ici à prendre des paramètres variables. Utilisez votre propre nom pour "MyAddin", et définissez votre version. Laissez tous les autres paramètres liés à OpenSim comme indiqué.
Démarrage de region-server
- Le serveur de région démarre, les classes de tous les modules de région sont chargées sans ordre particulier.
- Pour chaque ISharedRegionModule, une instance est créée et Initialise est appelée.
- Pour chaque instance de ISharedRegionModule, PostInitialise est appelé.
- Les Scene sont instanciées, une par une :
- Pour chaque Scene.
- pour chaque INonSharedRegionModule, une nouvelle instance est créée et Initialise est appelée.
- pour chaque INonSharedRegionModule et ISharedRegionModule, AddRegion(scene) est appelé. Les modules sont associés à la Scene (pour être supprimés lors de la suppression).
- pour chaque INonSharedRegionModule et ISharedRegionModule, RegionLoaded(scene) est appelé (vous pouvez accéder aux méthodes des autres modules de cette scène via scene.RequestModuleInterface<ModuleInterfaceType>() ici).
- Pour chaque Scene.
Ajout de région
- pour chaque INonSharedRegionModule, une nouvelle instance est créée et Initialise est appelée.
- pour chaque INonSharedRegionModule et ISharedRegionModule, AddRegion(scene) est appelé. Les modules sont associés à la Scène (pour être supprimés lors de la suppression).
- pour chaque INonSharedRegionModule et ISharedRegionModule, RegionLoaded(scene) est appelé.
Suppression de région
- Pour chaque INonSharedRegionModule de la scène et chaque ISharedRegionModule, RemoveRegion(scene) est appelé.
- Pour les INonSharedRegionModule, Close est appelé.
- Chaque référence de module de la scène est supprimée de la scène. Il ne devrait plus rester aucune référence après cela ; les INonSharedRegionModules pourraient être récupérés maintenant. Même si le runtime conserve beaucoup de ressources, les modules peuvent être entièrement vidés.
Redémarrage de région
Le redémarrage se fait par une séquence de "Suppression de région", suivie d'une séquence de "Ajout de région". Comme d'habitude, les avatars qui se trouvent dans cette région lorsqu'elle redémarre sont kickés.
En raison des réalités sur .net/mono, le redémarrage de la région est un échec.
Même si notre code le faisait correctement, .net ne le fera pas, gardant certaines ressources en utilisation, etc.
Arrêt du serveur de régions
- Pour chaque scène, effectuez l'étape "Suppression de région" :
- RemoveRegion est appelé pour toutes les scènes et modules, Close est appelé pour tous les INonSharedRegionModule.
- Close est appelé pour tous les ISharedRegionModule. Le ISharedRegionModule peut maintenant être récupéré.
Notes
- RemoveRegion/Close sert à faire le ménage. Les choses que vous avez ajoutées dans Initialise/AddRegion devraient être retirées dans Close/RemoveRegion à nouveau, respectivement.
- Les modules sont chargés via Mono.Addins. Cela signifie que vous pouvez construire vos propres assemblys avec des modules de région, et en les mettant dans le dossier <opensim>/bin, ils seront chargés automatiquement. Assurez-vous que les attributs corrects sont définis pour que l'addin soit chargé correctement.
Est-ce que c'est assez clair ? Ou devrions-nous ajouter un exemple explicite ? HomerHorwitz 18:21, 12 mai 2009 (UTC)
TODOs
- Configuration sur les modules qui doivent être chargés.
- nous avons déjà l'option de configuration enabled = true/false OpenSim.ini pour la plupart des modules de région --- DrScofield 09:53, 26 janvier 2009 (UTC)
ce qui est une solution terriblement ad hoc - nous avons vraiment besoin d'une meilleure façon de contrôler cela imho --- Justincc 20:26, 28 janvier 2009 (UTC)
Je suis d'accord avec Justin. Un module ne devrait pas être responsable de s'éteindre lui-même, il ne devrait jamais être chargé en premier lieu --SeanDague. 21:51, 28 janvier 2009 (UTC)