Comment dois-je suivre les positions des joueurs en temps réel dans un MMO?
14
Comment gardez-vous une trace des positions des joueurs dans un MMORPG? J'ai lu que vous pouvez utiliser une base de données ou stocker les coordonnées dans des fichiers. J'ai essayé d'utiliser une base de données mais c'était lent. Comment les fichiers peuvent-ils être utilisés pour garder une trace des positions des joueurs?
Comment les fichiers peuvent-ils être utilisés pour garder une trace des positions des joueurs?
Vous écrivez la position du joueur dans le fichier. Par exemple, si vous identifiez chaque joueur avec un numéro unique (ou un GUID), vous pouvez l'utiliser comme nom de fichier. Dans le fichier, écrivez simplement les données de position dans un format que vous pourrez analyser plus tard. Par exemple, 467239.txtpeut contenir 20, 3, 19si le joueur # 467239 se trouve à cet emplacement ( x, y, z ).
Ce n'est pas si différent de ce que vous feriez avec une base de données, cependant - une base de données ne devrait pas être "lente" à cette opération, elle devrait être très rapide (probablement plus rapide que les fichiers, car vous avez plus de surcharge d'E / S de disque ou de verrouillage d'E / S contention - si vous avez stocké plusieurs positions par fichier - dans une approche basée sur un système de fichiers).
Peut-être tentiez-vous d'utiliser la base de données ou le système de fichiers pour stocker la position du lecteur lors de l'exécution ? Vous ne devriez pas faire ça du tout .
Au moment de l'exécution, sur votre serveur, les positions des joueurs doivent être conservées en mémoire et mises à jour à cet endroit, comme vous le feriez avec n'importe quel autre type de jeu. Périodiquement, ils peuvent être enregistrés sur le disque ou tout autre stockage persistant - par exemple, lorsque le lecteur se repose, enregistre ou se déconnecte.
Mais écrire chaque position des joueurs sur le stockage de chaque mise à jour est inutile et extrêmement inefficace; il ne sera jamais assez rapide pour gérer quoi que ce soit qui ressemble à des échelles de joueur "massives".
Oui, en fait, je sauvegardais la position du joueur sur un postgreSQL lors de l'exécution. Mais si je le garde dans la mémoire du serveur, comment puis-je mettre à jour la position dans les clients?
Baccari
12
La méthode par laquelle le client est mis à jour est la même dans tous les cas: le serveur indique au client quelle est sa position via un message réseau (ou plus réaliste, le client, qui fait une prédiction locale, a également une position locale qui le serveur valide et confirme pour le client). Votre client ne doit pas avoir accès à la base de données à laquelle le serveur accède.
1
Je m'ennuie de dire "faites-le avec un fichier", seulement pour expliquer que c'est en fait pire que d'utiliser la base de données, puis d'expliquer quel est le vrai problème. Pourquoi avez-vous besoin de cette explication de fichier inutile en premier lieu? Cela ne fait que confondre le lecteur occasionnel, ce qui ne profite à personne.
o0 '.
6
D'après mon expérience dans le passé, ignorer les questions directes et simplement procéder à une conférence sur ce que je pense que "la bonne façon" devrait être plus conflictuelle et rend le PO moins réceptif à être éloigné des fondations les plus faibles, sa question initiale est venant de, c'est tout.
13
La position doit être dans la RAM pendant son utilisation. (ex: le personnage du joueur est dans le monde) Vous ne pouvez pas utiliser la base de données comme mémoire de fonctionnement. Eh bien, vous pouvez, mais ce sera terrible.
Vous devez enregistrer les positions régulièrement, mais pas à chaque fois qu'elles changent.
J'éviterais également de sauvegarder toutes les positions en même temps. Si vous souhaitez conserver la persistance en cas de panne d'un serveur, vous devez enregistrer la position aussi souvent que possible mais sur le temps libre du jeu. Faites-le simplement par lots.
Enregistrez 30 postes pendant que du temps libre est disponible.
Quant aux clients. Ils devraient recevoir des mises à jour (pertinentes) de l'état du jeu via une connexion à votre logiciel serveur. Pas de la DB ... Ce serait impraticable, lent, mauvais, mauvais et la force serait perturbée.
Ce que je fais sur mon serveur, c'est de mémoriser la direction des joueurs (vecteur) et la dernière position, si le joueur a une vitesse, je calcule la nouvelle position des joueurs toutes les 2 secondes.
Le client a bien sûr sa propre position et envoie une nouvelle direction (vecteur) au serveur.
Le serveur fait autorité sur la position et envoie un paquet de position si le client s'est déplacé d'une certaine distance depuis la dernière vérification (cela peut entraîner un effet élastique si le client n'est pas synchronisé).
La position doit être dans la RAM pendant son utilisation. (ex: le personnage du joueur est dans le monde) Vous ne pouvez pas utiliser la base de données comme mémoire de fonctionnement. Eh bien, vous pouvez, mais ce sera terrible.
Vous devez enregistrer les positions régulièrement, mais pas à chaque fois qu'elles changent.
J'éviterais également de sauvegarder toutes les positions en même temps. Si vous souhaitez conserver la persistance en cas de panne d'un serveur, vous devez enregistrer la position aussi souvent que possible mais sur le temps libre du jeu. Faites-le simplement par lots.
Enregistrez 30 postes pendant que du temps libre est disponible.
Quant aux clients. Ils devraient recevoir des mises à jour (pertinentes) de l'état du jeu via une connexion à votre logiciel serveur. Pas de la DB ... Ce serait impraticable, lent, mauvais, mauvais et la force serait perturbée.
la source
J'ai un thread séparé dans lequel je file pour enregistrer dans des fichiers tous les 500 ticks environ. Sinon, vous devez tout stocker dans la RAM.
la source
Ce que je fais sur mon serveur, c'est de mémoriser la direction des joueurs (vecteur) et la dernière position, si le joueur a une vitesse, je calcule la nouvelle position des joueurs toutes les 2 secondes.
Le client a bien sûr sa propre position et envoie une nouvelle direction (vecteur) au serveur.
Le serveur fait autorité sur la position et envoie un paquet de position si le client s'est déplacé d'une certaine distance depuis la dernière vérification (cela peut entraîner un effet élastique si le client n'est pas synchronisé).
Tout cela se passe bien sûr en mémoire.
la source