Jeux en ligne, ou quelque chose de plus rapide que le ajax pour l'envoi / la réception de données

Je le fais aussi vite que possible.

Ce que j'ai fait jusqu'à présent: le jeu que je vais exécuter avec JavaScript en utilisant setTimeout ou setInterval . Ce n'est pas flash ni rien de spécial. Ce que j'ai fait jusqu'à une épreuve de test (afin que vous puissiez mieux comprendre), c'est à peu près que la boucle Ajax continue d'envoyer des requêtes à une page PHP aussi rapidement que possible, alors PHP lit le $_GET dans l'URL de la Demande, puis PHP modifie un fichier appelé p1.html avec $_GET , qui est simplement les coordonnées d'axe x et y de joueur 1. Ainsi, dans le navigateur du joueur 2, il a pratiquement fait ce que j'ai dit plus haut, et maintenant, quand il reçoit la demande Ajax, il recevra les coordonnées du joueur 1. Donc, JavaScript fait ce qu'il fait et déplace le joueur 1 sur le navigateur du joueur 2. C'est ce que j'ai déjà fait moi-même, et je l'ai testé et oui, ça marche et oui, ça dure pour toujours quand j'ai réparé tous les bugs et toutes choses.

En disant cela, c'est ce que j'ai fait jusqu'ici, mais ce n'est pas assez rapide si je voulais un jeu de combat en ligne ou un jeu de défilement latéral en temps réel. C'est donc ce dont j'ai besoin d'aide. Je connais beaucoup de choses sur w3schools.com, mais je ne sais juste pas comment faire ce travail. C'est probablement ça. J'ai juste besoin du navigateur 1, pour obtenir des données sur le navigateur 2, quelque chose comme cela "1.100.200" ou un peu plus longtemps en fait, et le navigateur 2 a lu ces données en tant que variable en JavaScript (tout comme x="received data"; ) et c'est ça. JavaScript fera le reste.

Je suis sûr que je peux programmer tout ce dont j'ai besoin, mais pour envoyer des données du point A au point B comme 50 fois par seconde, je ne connais rien à ce sujet. Même pas un nom. Enfin, les URL et les exemples seraient très agréables (pour être plus clair). Surtout si c'est déjà sur w3schools.com (avec des exemples) et je l'ai raté.

La réponse est simple: utilisez des websockets . Ils permettent la transmission immédiate des données dans les deux sens pour des interactions apparemment instantanées. Ils éliminent la nécessité de tirer des données du client qui est lent et lourd (y compris pour le serveur). Notez que c'est la solution utilisée dans mon jeu préféré pour la notification push.

Vous pourriez être intéressé par cette introduction sur les websockets sur PHP . Mais notez que PHP n'est vraiment pas la solution la plus efficace pour la gestion des connexions longues et les jeux en temps réel (vous pourriez préférer Go, node.js, java, etc.).

Vous pouvez utiliser le websocket

L'avantage avec WebSockets (par rapport à AJAX) est essentiellement qu'il y a moins de frais généraux HTTP. Une fois la connexion établie, tous les messages futurs passent sur un socket plutôt que sur de nouveaux appels de demande / réponse HTTP. Donc, vous supposez que WebSockets peut envoyer et recevoir beaucoup plus de messages par unité de temps. Il s'avère que c'est vrai. Mais il y a une réalité très amère une fois que vous avez ajouté la latence dans le mélange.

Les WebSockets sont environ 10-20% plus rapides que AJAX

la source

Ce qui se passe lorsque nous utilisons ajax avec php est

  1. Il ouvre une nouvelle connexion au serveur apache
  2. Que apache recherche le script php et lance le
  3. Maintenant, le script php se connecte au serveur pour interroger et il renverra le résultat.

Mais ce que fait le websocket, c'est éliminer 2 processus de connexion et envoyer simplement un message au serveur. Le serveur est déjà connecté au serveur sql

Un autre avantage est que la connexion entre le client et le serveur reste ouverte, le serveur peut envoyer des messages au client. Dans ajax vous devez cal chaque fois

Je suis d'accord avec les autres affiches: les websockets sont la technologie que vous devez utiliser. Le seul inconvénient est que les Websockets ne sont pas pris en charge par Internet Explorer avant la version 10, qui n'est actuellement disponible que pour Windows 8 et ne sera disponible pour aucune version de Windows avant Windows 7. Lorsque vous souhaitez prendre en charge les utilisateurs d'IE sur Vista et XP , Vous avez besoin d'un repli avec AJAX ou Flash.

Mais il y a un autre problème auquel vous pourriez rencontrer:

Pour envoyer des données du point A au point B comme 50 fois par seconde

Lorsque vous devez envoyer des données fréquemment, quelque chose semble être incorrect avec votre protocole. Prévoyez-vous de mettre à jour les positions des joueurs à des intervalles réguliers de 20 ms même s'ils n'ont pas changé (le joueur est debout) ou de changer à taux constant (le joueur marche dans une direction)? Je vous suggère de ne pas transférer de position, mais seulement des changements dans la direction de mouvement (commencer à déplacer vers la gauche, arrêter de bouger vers la gauche à X: Y, etc.) vous pouvez sécuriser beaucoup de bande passante de cette façon.

Lorsque l'architecture est correctement, les demandes d' interrogation longues ajax fonctionnent très bien pour les communications non en temps réel. Cela étant dit, un sondage long est plus un "hack"; Si vous cherchez quelque chose construit avec la connectivité souhaitée à l'esprit, vous choisirez devrait être des sites Web définitivement:

WebSockets est une technologie de pointe qui permet d'ouvrir une session de communication interactive entre le navigateur de l'utilisateur et un serveur. Avec cette API, vous pouvez envoyer des messages à un serveur et recevoir des réponses événementielles sans avoir à interroger le serveur pour une réponse.

Découvrez le navigateur pour l'inspiration – les beaux membres de Mozilla ont créé tout leur code source sur github !

Essayez ceci: http://socket.io/

Il peut faire des websockets, des sondages longs, des prises flash et plus encore! Et ils prétendent qu'il prend en charge IE 5.5.

Les jeux Web sont géniaux et ont souvent été mentionnés, mais les appareils Android et 16% des navigateurs ne prennent pas en charge les websockets ( CanIUse.com ). De nombreuses installations de serveurs ne prennent pas non plus en charge les websockets, y compris les configurations partagées LAMP. Si vous avez un hôte partagé ou si vous souhaitez bénéficier d'un large soutien, les boîtes Web peuvent ne pas être une option valide.

Le sondage long est la seule alternative valable pour les websockets. Il a un soutien plus large (il devrait fonctionner avec presque tous les serveurs et clients), mais il présente un inconvénient important sur les serveurs qui ne gèrent pas bien des connexions simultanées, comme Apache. Un autre inconvénient est que vous devez effectuer de nombreuses requêtes régulières de base de données (probablement plusieurs par seconde), quel que soit le nombre d'utilisateurs connectés. L'utilisation de la mémoire partagée, comme shm_attach() en PHP, pourrait faciliter ce fardeau. Comme le script du serveur surveille les nouveaux messages, ils sont immédiatement envoyés via la connexion ouverte lorsqu'ils sont trouvés. Le client recevra le message puis redémarre une longue connexion avec une nouvelle demande.

Si vous ne pouvez pas utiliser des prises Web, ce qui pourrait bien être le cas, vous pouvez utiliser un hybride d'interrogation long et court (voir ci-dessous). L'utilisation d'un sondage très long n'est pas nécessaire et prend trop de ressources. Après environ 10 ou 15 secondes de connexion constante, vous devez le fermer et passer à un sondage court à l'ancienne, qui n'est qu'une requête GET régulière répétée.

Ce code jQuery n'est pas testé, mais vous avez l'idée:

 function longpoll(lastid) { /* Start recursive long polling. The server script must stay connected for the 15 seconds that the client waits for a response. This can be done with a `while()` loop in PHP. */ console.log("Long polling started..."); if (typeof lastid == 'undefined') { lastid = 0; } //long polling... setTimeout(function () { $.ajax({ url: "stream.php?long=1&lastid=" + lastid, success: function (payload) { if (payload.status == "result") { //result isn't an error. lastid is used as bookmark. console.log("Long poll Msg: " + payload.lastid + ": " + payload.msg); longpoll(lastid); //Call the next poll recursively } else if (payload.status == "error") { console.log("Long poll error."); } else { console.log("Long poll no results."); } /* Now, we haven't had a message in 15 seconds. Rather than reconnect by calling poll() again, just start short polling by repeatedly doing an normal AJAX GET request */ shortpoll(lastid); //start short polling after 15 seconds }, dataType: "json" }); }, 15000); //keep connection open for 15 seconds }; function shortpoll(lastid) { console.log("Short polling started."); //short polling... var delay = 500; //start with half-second intervals setInterval(function () { console.log("setinterval started."); $.ajax({ url: "stream.php?long=0&lastid=" + lastid, success: function (payload) { if (payload.status == "result") { console.log(payload.lastid + ": " + payload.msg); longpoll(lastid); //Call the next poll recursively } else if (payload.status == "error") { console.log("Short poll error."); } else { console.log("Short poll. No result."); } }, dataType: "json" }); delay = Math.min(delay + 10, 20000) //increment but don't go over 20 seconds }, delay); } 

Le sondage court réduit le nombre de connexions simultanées, en utilisant des sondages répétés (en demandant) à la place. Comme toujours, l'inconvénient d'un vote court est le retard dans la réception de nouveaux messages. Cependant, cela est analogue à la vie réelle, donc ce ne devrait pas être une grosse affaire. (Si quelqu'un ne vous a pas appelés au cours de la dernière semaine, ils ne vont probablement pas vous appeler au cours des cinq prochaines minutes, afin de vérifier votre téléphone toutes les cinq minutes serait stupide.)