Bonjour,
mon moteur de jeu (il n'a pas de nom...) s'articule entre client/serveur
j'ai commencé l'écriture d'un proto-client qui à ce stade me permet de faire bouger un élément 3D, il gère donc le clavier/souris (OIS) et l'affichage 3D (Ogre3D). Point que je tiens à préciser maintenant mais utile pour la suite, il utilise (actuellement) une seule scène.
De l'autre j'ai commencé un proto-serveur, pour l'instant il lit des données enregistrées dans une base sql. Je suis présentement entrain d'étudier la programmation réseau avec ASIO.
donc ça c'était pour le point topo concernant la ligne de front.
maintenant avec ASIO je me pose également les questions de la masse d'informations utiles à envoyer et surtout comment évaluer qu'elle partie de l'ensemble des données présentes sur le serveur doivent être à envoyer.
Prenons la position 3D de l'ensemble des entités. Les objets qui sont hors du champs de vue + un delta (en terme de distance, je ne parle pas de l'orientation) sont inutiles à envoyer. Je me suis donc demandé comment calculer la distance entre chaque objets, évidement un calcul bourrin est à exclure... j'ai d'abord découvert l'octree, structure qui semble la plus intéressante pour tout objet statique, si j'ai bien compris, car bouger un objet au sein de l'octree demande des calculs pour générer un nouvel octree.
Je me suis dit ok, bon pour définir les emplacement des cailloux...
maintenant les objets qui se déplacent (on ne jette pas de caillou chez moi, donc n'essayez pas de m'avoir la dessus) j'ai lu dans un livre papier le concept d'aura, en gros chaque perso à ses sens qui sont définis par un espace autour de lui servant à détecter les autre entités. Je me suis dit ok, sur mon serveur je vais utiliser ogre (sans faire de rendu) pour créer un octree qui contiendra mes cailloux. Pour ce qui est des auras je pense à faire de la détection de collisions dans un scenegraph. Mais où est en définitif la question ?
et bien elle s'en vient! parce que la question la voici :
« si je commence à regarder ce que chaque aura touche dans le monde des animés, ça ne revient-il pas à calculer des distances entre chaque aura-entité ? et donc de faire ce que je voulais pas faire, i.e. faire un calcul brute de force ? »
de plus, il me semble vital de ne pas charger la mémoire avec la position d'un caillou, ou d'une chèvre qui sont dans une zone sans joueur, donc la base de donnée SQL est parfaite pour ça. mais là où il y a du monde, dois-je tout mettre en mémoire puis une fois qu'il n'y a plus personne sauvegarder l'état dans la base sql ? parce que je suis pas sur de voir comment orchestrer une gestion de la base sql avec les entités : actuellement je pencherais pour avoir un octree d'index unique de chaque objet statique, et qui au besoin, chercher avec le numéro unique les informations dans la base. Pour les objets animés, faire un méga scenegraph qui contient donc un index, la position, mais aussi éventuellement l'orientation. En définitif,
« en temps réel, la base SQL doit-elle uniquement être utilisée pour ce qui n'est pas en rapport avec la 3D ? »
ou dit autrement :
« la base SQL, en temps réel et excepté l'index, sert-elle qu'à stocker des variables non liées à la 3D ? »
edit :: en fait, je me suis dis que j'allais utiliser deux bases, l'une en temps réels (màj lors de chaque cycle) et l'autre de sauvegardes cette dernière contiendra tout (incluant la position 3D par exemple de chaque entité) elle sera remplie qu'une fois toutes les X minutes pour faire un point de sauvegarde et ne pas surcharger le cpu à sauvegarder/lire les données 3D des objets qui ont une forte probabilité d'être manipulés.
Partager