Question

Je suis en train d'élaborer un texte de base de jeu, de la BOUE.J'ai la base des fonctions du programme de prêt, et maintenant, j'aimerais vous permet de connecter plus d'un client à la fois.J'ai l'intention d'utiliser des threads pour accomplir cette.

Dans mon jeu, j'ai besoin de stocker des informations telles que la position actuelle ou à la santé de points pour chaque joueur.J'ai pu la tenir dans la base de données, mais comme il va changer très rapidement, parfois, à chaque seconde, l'utilisation de la base de données serait inefficace (suis-je le droit?).

Ma question est:peut threads se comporter comme des "sessions", c'est à dire contenir des données propres à chaque utilisateur?

Si oui, pourriez-vous me diriger vers quelques ressources que je pourrais utiliser pour m'aider à comprendre comment cela fonctionne?

Si non, que proposez-vous?Une base de données une bonne option ou recommanderiez-vous autre chose?

Cheers, Eleeist

Était-ce utile?

La solution

Oui, ils peuvent, mais c'est une façon de faire des choses stupides.D'une part, il vous enferme de manière permanente dans un modèle "One thread par client".Pour une autre chose, cela rend difficile (peut-être même impossible) de mettre en œuvre des interactions entre les utilisateurs, que je suis sûr que votre boue a.

Au lieu de cela, disposez d'une collection de personnes qui stockent vos utilisateurs, avec des données sur chaque utilisateur.Enregistrez des données persistantes à la base de données, mais vous n'avez pas besoin de mettre à jour les données éphémères sur chaque changement.

Un moyen de gérer cela est d'avoir un "changé" booléen dans chaque utilisateur.Lorsque vous effectuez un changement critique à un utilisateur, écrivez-les immédiatement à la base de données.Mais s'il s'agit d'un changement de routine, non critique, définissez simplement le drapeau "changé".Ensuite, demandez à un thread sur un moment de temps en temps et écrivez des utilisateurs modifiés vers la base de données (et effacez le drapeau "modifié").

Utilisez la synchronisation appropriée, bien sûr!

Autres conseils

Un Thread par connexion / session de l'utilisateur ne sera pas à l'échelle.Vous ne pouvez avoir N nombre de threads actifs où N est égal au nombre de cœurs physiques / processeurs de votre machine.Vous êtes également limité par la quantité de mémoire de votre machine pour le nombre de threads que vous pouvez créer un temps, certains systèmes d'exploitation viens de mettre des limites arbitraires ainsi.

Il n'y a rien de magique à propos des Threads dans le traitement de plusieurs clients.Ils seront seulement de rendre votre code plus compliqué et moins déterministe et donc plus difficile à raisonner sur ce qui se passe réellement lorsque vous commencez la chasse des erreurs de logique.

Un Thread par connexion / session de l'utilisateur serait une anti-modèle!

Threads doit être apatrides les travailleurs qui tirent les choses simultanées files d'attente et de traiter les données.

Regardez simultanée des cartes pour la mise en cache ( ou d'utiliser certains approprié de solution de mise en cache ) et de les traiter et de faire quelque chose d'autre.Voir java.util.concurrent pour toutes les primitives de classes dont vous avez besoin pour mettre en œuvre quelque chose correctement.

ThreadLocal est votre ami!:)

http://docs.oracle.com/Javase / 6 / Docs / API / Java / Lang / ThreadLocal.html

ThreadLocal fournit un stockage sur le fil lui-même.Donc, le même appel de 2 fils différents retournera / stockera différentes données.

Le plus grand danger est d'avoir une fuite entre les fils.Vous devriez être absolument sûr que si un utilisateur différent a utilisé un fil que quelqu'un d'autre utilisait, vous réinitialiseriez / effaceriez les données.

Au lieu de vous inquiéter des threads et de la sécurité de thread, j'utiliserais une base de données SQL en mémoire comme HSQLDB àInformations sur la session de magasin.Parmi d'autres avantages, si votre boue s'avère être les prochains oiseaux en colère, vous pourriez plus facilement réduire la chose.

Certainement, vous pouvez utiliser des threads comme des sessions.Mais c'est un peu sur la marque.

Le point principal des fils est la capacité de l'exécution asynchrone simultanée.Très probablement, vous ne voulez pas que des événements reçus de vos clients de boue se produisent dans un ordre parallèle et incontrôlé.

Pour assurer la cohérence du monde J'utiliserais une base de données en mémoire pour stocker le monde du jeu.Je serais sérialiser les mises à jour, ou au moins certains mises à jour.Imaginez deux joueurs en parallèle frappant un monstre avec HP 100. Chacun inflige 100 dégâts.Si vous ne séralisez pas les mises à jour, vous pourriez finir par donner crédit à 100 dommages aux deux joueurs.Imaginez deux joueurs qui prennent simultanément un butin du monstre.Sans sérialisation correcte, ils pourraient se retrouver chacun avec leur propre copie du butin.

Les threads, d'autre part, sont bons pour les communications asynchrones avec des clients.Utilisez des threads pour cela, à moins que quelque chose d'autre (comme un serveur Web) le fait pour vous déjà.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top