Bonjour,
Je developpe un MMORPG en java (un jeu en reseau quoi).
J'ai une question dont j'aimerais bien vous faire part car je commence à serieusement faire chauffer me neuronnes en ce qui concerne le stockage des objets du jeu. J'ai décidé de les stocker en mémoire vive et pas dans une base de donnée.
En fait, pour stocker ces objets (qui sont autant des personnages que des batiments ou des pieces de batiment) que j'apellerais Item, j'ai d'abord prit le parti que certains objets qui peuvent en contenir d'autres seront marqués ItemContainer et implémenteront des méthodes d'ajout et de retrait.
Il me faut souvent acceder au conteneur parent d'un objet et donc chaque objet contient une référence sur son conteneur parent du type ItemContainer.
Je transfère mes objets en les sérialisant, donc à l'arrivée chez le client, ce lien sur le conteneur parent n'est plus valable (les objets ont d'autres références).
Pour pallier à ce problème, j'ai utilisé une fonction qui recherche le bon conteneur (en comparant l'ID de l'Item) à chaque fois que j'ai un nouvel objet.
Ce systeme me pose beaucoup de problèmes, j'ai des erreurs de synchronisation inextricables, et j'ai pensé à autre chose.
Pourquoi ne pas me servir d'une table de hashage ou les ID des Items seraient les clefs et les Items les objets dans la table.
Ca résoud completement mes problèmes des parents parce que je référence des IDs.
Seulement, je commence à implémenter ce systeme, en faisant en sorte que tout mes objets et conteneurs d'objets soient dans la meme table et facilement repêchables par leur ID, mais le problème qui se pose, c'est que je dois souvent repérer ces objets par leur position (leur position dans le monde, dans le jeu), et énumérer cette liste à chaque fois pour retrouver un ensemble d'Items bien positionnés peut finir par être énorme.
Par exemple pour trouver les personnes dans un certain rectangle:
Code :
- public VisibleItems getVisiblesItemsOf(Personnage per){
- //Container pour l'ensemble des Items visibles
- VisibleItems visibleItems=new VisibleItems();
- //Pour manipuler la position du personnage facilement
- Position p=per.position;
- //On détermine les bords
- int minX=p.x-per.getParentItem(this).getClientNombreCaseX()/2;
- int minY=p.y-per.getParentItem(this).getClientNombreCaseY()/2;
- int maxX=p.x+per.getParentItem(this).getClientNombreCaseX()/2;
- int maxY=p.y+per.getParentItem(this).getClientNombreCaseY()/2;
- //On récupère l'itérateur sur la Hashtable
- //(qui pourra itérer sur des 10 aines de milliers d'éléments c'est pas bien)
- Iterator<Item> i = items.iterator();
- //On itère et on teste tout un tas de conditions pour ajouter l'objet
- while(i.hasNext()){
- Item item=i.next();
- if(!item.equals(per))
- if(item.position.x>=minX && item.position.x<=maxX)
- if(item.position.y>=minY && item.position.y<=maxY)
- if(item.getParentItem(this).equals(per.getParentItem(this)))
- visibleItems.items.add(item);
- }
- return visibleItems;
- }
|
Alors voila, je commence à m'étouffer quand je pense que je suis bêtement en train de réinventer la base de données.
Donc mes questions après ce court état des lieux sont:
-n'y a t'il pas moyen d'utiliser des structures avec des clefs multiples? (clef Id, Clef Position, Objet Item)?
-suis-je vraiment obligé d'utiliser une base de donnée?
-que pensez vous qu'il soit le mieux entre séparer les conteneurs et tout mettre dans le même?
Voila, merci de votre lecture et de vos réponses.
Message édité par milootooloo le 06-10-2006 à 07:16:23