2009-12-31 6 views
1

Je suis surtout à la recherche de conseils d'installation et des conseils sur la façon de s'y prendre. Je vais expliquer dans le plus de détails que je peux penser et noter également les approches possibles qui peuvent être plausibles. Le but de ceci est de créer un jeu de navigateur en temps réel, la meilleure méthode que j'ai trouvée pour mes besoins serait d'utiliser "longue interrogation" avec ajax, qui va fondamentalement configurer une requête avec le serveur qui va "se bloquer" Là, le serveur a quelque chose à envoyer, puis rétablir la connexion à la réception pour plus de données. Pour mes besoins, cela va gérer un système de chat ainsi que le mouvement des personnages, IE: si un joueur entre dans la même zone, les clients recevront une réponse pour les informer et ainsi mettre à jour le navigateur client pour le montrer. Ce qui précède est relativement facile à mettre en œuvre et j'ai déjà fait un cas de test pour cela, mais je veux l'améliorer, du côté du serveur, il exécute une boucle pendant X temps avant qu'il ne s'auto-temporise automatiquement et renvoyer et chaîne vide, donc une autre connexion peut être faite, c'est pour empêcher les boucles infinies et utiliser les ressources dans les cas où il ne devrait pas. Au lieu de rechercher la base de données sur chaque cycle de boucle (serait cher je crois) pour les messages qui doivent être envoyés au client, j'utilise flatfiles, si un fichier a un horodatage modifié supérieur au dernier message envoyé au client, alors il y a quelque chose de nouveau à envoyer. Cependant je crois que ce serait aussi cher (pas autant que d'utiliser une base de données mysql si) une fois fait quelques fois par seconde. Mon processus de réflexion sur ceci était d'avoir un programme C++ (pour la vitesse) constamment en cours d'exécution, et l'utiliser pour des recherches très rapides en mémoire pour les nouveaux messages et ainsi de suite, cela me donnerait aussi le bonus supplémentaire de pouvoir avoir des robots dans le jeu que le serveur peut contrôler pour une approche/approche plus en temps réel, mais je n'ai aucune idée si cela est encore possible et mes recherches sur google ont été infructueuses.Serveur de jeu par navigateur en temps réel

L'approche que j'aimerais le plus pouvoir faire, est de continuer à utiliser PHP pour faire le rendu et le contrôle de la page etc, et que les requêtes ajax vont à l'application C++ (qui sera toujours en cours) qui peut gérer tous les aspects en temps réel. CGI défait le but de l'approche ci-dessus, car il crée une nouvelle instance de l'application sur chaque demande, qui est à la fois lent et exactement ce que je ne veux pas, j'ai php pour cela et je ne veux pas changer un langage fonctionnant parfaitement pour un autre qui serait mieux adapté, PHP cependant (à ma connaissance) ne peut pas stocker des choses en mémoire (ram) et ainsi de suite.

Une autre approche que j'ai pensé était d'utiliser des sockets php pour se connecter à l'application C++, même si je n'ai aucune idée de la faisabilité. L'application C++ seulement fondamentalement aura besoin de contrôler les bots (AI) et les messages du système de chat .. Je n'ai absolument aucune idée de la façon de traiter les bots via PHP.

J'espère que cela explique pleinement ce que mes intentions et objectifs sont, donc si quelqu'un a des conseils ou des conseils alors s'il vous plaît répondez et aidez-moi, il serait très apprécié. Si vous avez besoin d'informations supplémentaires (si je n'ai pas couvert quelque chose ou quelque chose de très bien), je serai heureux de tenter de mieux vous expliquer.

Répondre

2

À quelle vitesse les réactions doivent-elles être? Pour tout ce qui touche aux jeux d'action en temps réel, AJAX/Comet va être beaucoup trop lent. Les frais généraux sont aussi vraiment déprimants.

La voie à suivre pour ce genre de chose sera probablement WebSocket, avec un serveur personnalisé sur le backend. Mais je ne pense pas que cela signifie que vous devez recourir à C [++] pour cela; le goulot d'étranglement est probablement le réseau et non le processeur du serveur. J'utilise un Python SocketServer avec un système de réplication de message trivial - toute la logique du jeu dans mon cas est du côté du client, avec du JavaScript compliqué maintenant un monde de jeu cohérent face au décalage - mais même pour un côté serveur plus complexe, je pense qu'un langage de script sera probablement très bien.

WebSocket n'est pas encore prêt; il n'y a pas d'implémentation de navigateur standard. En attendant, j'utilise une sauvegarde Flash Socket qui émule l'interface WebSocket. Les sockets Flash ont leurs propres problèmes en ce qu'ils n'arrivent pas à négocier des proxies, mais ils sont rapides et nous espérons que leur besoin diminuera à mesure que WebSocket arrivera correctement.

+0

J'ai regardé dans la comète et j'ai pensé qu'ils étaient trop limitatifs, j'ai vu le long travail d'interrogation pour un jeu RPG appelé Travians (Il est connecté à une adresse IP sur le port 8010). Le problème avec le langage de script est qu'il n'est pas persistant (je crois que c'est le mot correct? Pour élaborer ce n'est pas constamment en cours d'exécution, donc la gestion des états de bot avec lui serait un problème?) Pour expliquer davantage l'approche de travians , leur interrogation longue reçoit une chaîne de commande que le JS sur le client manipule plus loin, par exemple il recevra "MoveChar Steve

+0

Un langage de script peut être utilisé de manière persistante plutôt que simplement comme un backend de serveur Web. C'est ce que je fais avec Python et vous pouvez le faire dans n'importe quel langage de script (même PHP, bien que ce ne soit pas particulièrement adapté). Moi aussi j'utilise une chaîne de commande par ligne, bien que dans mon cas, ce sont des commandes de niveau inférieur comme '.1 f' (bouton gauche appuyé sur l'image de jeu 15). – bobince

+0

Je n'ai aucune expérience avec python, c'est pourquoi j'ai d'abord choisi C++ pour cette zone, devrais-je utiliser les sockets php et me connecter à l'application C++ de cette façon sur chaque requête ajax? – Steve

2

La lecture de votre message déclenche la sonnerie d'alarme. Dans quelle mesure connaissez-vous le code multithread? Avec C++? Si la réponse est "pas très", alors je crains que vous ne soyez en train de mordre un gros morceau. Pourquoi ne pas tirer parti de certaines implémentations de serveurs COMET existantes (testées et testées) plutôt que de cette approche barebones? Quelle que soit l'application que vous avez en tête, elle devrait être complètement séparée de la mise en œuvre des communications.

En tant que quelqu'un qui a implémenté un tel serveur, je peux vous dire qu'il faudra beaucoup d'itérations de conception et beaucoup de temps pour y arriver. Tester un tel produit de manière réaliste est également un processus très délicat.

+0

Honnêtement, je ne voyais pas le besoin d'être complètement multi-thread, la raison en est mon expérience avec les jeux MUD (les joueurs se connectent à ceux via telnet), les serveurs n'étaient pas multithread (seules les recherches DNS), ayant des joueurs dans leur propre fil, j'imaginais que cela serait exagéré et entraverait la performance plus que les gains, car Bobince (ci-dessous) a mentionné que mon principal goulot d'étranglement sera le réseau. – Steve

+0

Si vous avez décidé d'écrire un serveur de jeux en C++ parce qu'il est rapide, il vaut mieux être familier avec le multithreading/concurrent pour gérer le côté réseau des E/S. Il y aura un état partagé qui, selon toute vraisemblance, sera accessible à des moments imprévisibles, pilotés par/entraînant des entrées/sorties réseau. Une approche non-threaded serait ... pauvre. Je ne préconise pas un joueur par thread, mais le fait que IO arrive simultanément est inévitable et doit être adressé si la vitesse est importante. – spender

+0

Vous pouvez parfaitement faire des E/S asynchrones sans enfilage. Qu'il s'agisse de la façon la plus appropriée ou la plus facile de coder est discutable, mais il existe d'importants frameworks de réseau et serveurs qui adoptent cette approche. – bobince