Ich mache das so kurz wie möglich.

Was ich bisher gemacht habe: Das Spiel, das ich habe, wird mit JavaScript unter Verwendung von setTimeout oder setInterval ausgeführt. Es ist kein Blitz oder etwas Besonderes. Was ich bisher wie einen Testlauf gemacht habe (damit Sie es besser verstehen können), ist so ziemlich eine Schleife von Ajax, um weiterhin Anfragen so schnell wie möglich an eine PHP-Seite zu senden, die dann von PHP das $_GET in der URL aus der Anfrage, dann bearbeitet PHP eine Datei namens p1.html mit dem $_GET, bei dem es sich einfach um die x- und y-Achsenkoordinaten von Spieler 1 handelt. Im Browser von Spieler 2 hat es so ziemlich das getan, was ich oben gesagt habe, und jetzt, wenn es die Ajax-Anfrage erhält, erhält es die Koordinaten von Spieler 1. JavaScript macht also das, was es tut, und verschiebt Spieler 1 im Browser von Spieler 2. Das habe ich schon selbst gemacht und ich habe es getestet und ja, es funktioniert und ja, es dauert ewig, wenn ich alle Fehler und Sachen behoben habe.

Das zu sagen, das habe ich bisher gemacht, aber das ist nicht schnell genug, wenn ich ein Online-Kampfspiel oder ein Echtzeit-Side-Scrolling-Spiel haben möchte. Deshalb brauche ich Hilfe. Ich kenne viele Dinge auf w3schools.com, aber ich weiß einfach nicht, wie ich diesen Job erledigen soll. Das ist es wahrscheinlich. Ich brauche nur Browser 1, um Daten zu Browser 2 zu bringen, so etwas wie "1.100.200" oder etwas länger, und Browser 2 muss diese Daten als Variable in JavaScript lesen (so etwas wie x="received data";), und das ist einfach es. JavaScript erledigt den Rest.

Ich bin sicher, ich kann alles, was ich brauche, selbst programmieren, aber für das Senden von Daten von Punkt A nach Punkt B wie 50 Mal pro Sekunde weiß ich einfach nichts darüber. Nicht einmal ein Name. Und zum Schluss wären URLs und Beispiele sehr schön (um klarer zu sein). Vor allem, wenn es bereits auf w3schools.com ist (mit Beispielen) und ich es einfach verpasst habe.

11
Hybrilynx 10 Okt. 2012 im 11:58

6 Antworten

Beste Antwort

Die Antwort ist einfach: Verwenden Sie Websockets. Sie ermöglichen den sofortigen Push von Daten in beide Richtungen für scheinbar sofortige Interaktionen. Sie machen das Abrufen von Daten vom Client überflüssig, die langsam und schwer sind (auch für den Server). Beachten Sie, dass dies die Lösung ist, die in meinem Lieblingsspiel für Benachrichtigungs-Push verwendet wird.

Diese dieser Einführung zu Websockets unter PHP könnte Sie interessieren. Beachten Sie jedoch, dass PHP nicht die effizienteste Lösung für die Bearbeitung langer Verbindungen und Echtzeitspiele ist (möglicherweise bevorzugen Sie Go, node.js, Java usw.).

15
Denys Séguret 10 Okt. 2012 im 08:06

Bei korrekter Architektur funktionieren lange Abrufe Ajax-Anforderungen für Nicht-Echtzeit-Kommunikation einwandfrei. Davon abgesehen ist langes Polling eher ein "Hack"; Wenn Sie nach etwas Erstelltem suchen, das die gewünschte Konnektivität berücksichtigt, sollten Sie Websockets definitiv:

WebSockets ist eine fortschrittliche Technologie, mit der eine interaktive Kommunikationssitzung zwischen dem Browser des Benutzers und einem Server geöffnet werden kann. Mit dieser API können Sie Nachrichten an einen Server senden und ereignisgesteuerte Antworten empfangen, ohne den Server nach einer Antwort abfragen zu müssen.

Inspiration finden Sie unter browserquest - die feinen Leute bei Mozilla haben ihren gesamten Quellcode zur Verfügung gestellt auf github!

6
Community 23 Mai 2017 im 12:23

Sie können den Websocket verwenden

Der Vorteil von WebSockets (gegenüber AJAX) besteht im Wesentlichen darin, dass weniger HTTP-Overhead entsteht. Sobald die Verbindung hergestellt wurde, erfolgt die gesamte zukünftige Nachrichtenübermittlung über einen Socket und nicht über neue HTTP-Anforderungs- / Antwortaufrufe. Sie würden also davon ausgehen, dass WebSockets pro Zeiteinheit viel mehr Nachrichten senden und empfangen können. Es stellt sich heraus, dass das stimmt. Aber es gibt eine sehr bittere Realität, wenn Sie der Mischung Latenz hinzufügen.

WebSockets sind ungefähr 10-20% schneller als AJAX

Quelle

Was passiert, wenn wir Ajax mit PHP verwenden, ist

  1. Es öffnet sich eine neue Verbindung zum Apache-Server
  2. als Apache sucht nach PHP-Skript und startet es
  3. Jetzt stellt das PHP-Skript eine Verbindung zum Server her, um eine Abfrage durchzuführen, und gibt das Ergebnis zurück.

Der Websocket eliminiert jedoch zwei Verbindungsprozesse und sendet lediglich eine Nachricht an den Server. Server ist bereits mit dem SQL Server verbunden

Ein weiterer Vorteil ist, dass die Verbindung zwischen dem Client und dem Server offen bleibt und der Server Nachrichten an den Client senden kann. In Ajax müssen Sie jedes Mal anrufen

16
Shog9 19 Feb. 2014 im 17:56

Ich stimme den anderen Postern zu: Websockets sind die Technologie, die Sie verwenden sollten. Der einzige Nachteil ist, dass Websockets von Internet Explorer vor Version 10 nicht unterstützt werden. Diese Version ist derzeit nur für Windows 8 verfügbar und steht für keine Windows-Version vor Windows 7 zur Verfügung. Wenn Sie IE-Benutzer unter Vista und XP unterstützen möchten benötigen Sie einen Fallback mit AJAX oder Flash.

Es gibt jedoch noch ein anderes Problem, auf das Sie stoßen könnten:

zum Senden von Daten von Punkt A nach Punkt B wie 50 Mal pro Sekunde

Wenn Sie so häufig Daten senden müssen, scheint etwas mit Ihrem Protokoll nicht zu stimmen. Planen Sie, die Spielerpositionen in regelmäßigen Abständen von 20 ms zu aktualisieren, obwohl sie sich nicht geändert haben (Spieler steht) oder sich mit konstanter Geschwindigkeit ändern (Spieler geht in eine Richtung)? Ich würde Ihnen empfehlen, keine Positionen zu übertragen, sondern nur Änderungen in der Bewegungsrichtung (beginnen Sie, sich nach links zu bewegen, stoppen Sie die Bewegung nach links bei X: Y usw.). Auf diese Weise können Sie viel Bandbreite sparen.

9
Philipp 10 Okt. 2012 im 08:21

Websockets sind großartig und wurden oft erwähnt, aber Android-Geräte und 16% der Browser unterstützen keine Websockets (CanIUse). com). Viele Serverinstallationen unterstützen auch keine Websockets, einschließlich gemeinsam genutzter LAMP-Setups. Wenn Sie einen gemeinsam genutzten Host haben oder eine breite Unterstützung wünschen, sind Websockets möglicherweise keine gültige Option.

Lange Abfragen sind die einzig gültige Alternative zu Websockets. Es bietet eine breitere Unterstützung (es sollte mit fast allen Servern und Clients funktionieren), hat jedoch einen erheblichen Nachteil bei Servern, die nicht viele gleichzeitige Verbindungen gut verarbeiten - wie Apache. Ein weiterer Nachteil ist, dass Sie viele reguläre Datenbankabfragen durchführen müssen (wahrscheinlich mehrere pro Sekunde), unabhängig davon, wie viele Benutzer verbunden sind. Die Verwendung von gemeinsam genutztem Speicher wie shm_attach() in PHP könnte diese Belastung verringern. Wenn das Serverskript neue Nachrichten überwacht, werden diese sofort über die offene Verbindung gesendet, wenn sie gefunden werden. Der Client erhält die Nachricht und startet eine lange Verbindung mit einer neuen Anforderung neu.

Wenn Sie keine Websockets verwenden können, was durchaus der Fall sein kann, können Sie einen Long- und Short-Polling-Hybrid verwenden (siehe unten). Die Verwendung sehr langer Abfragen ist nicht erforderlich und beansprucht zu viele Ressourcen. Nach etwa 10 oder 15 Sekunden ständiger Verbindung sollten Sie die Verbindung schließen und zu altmodischem Kurzabruf wechseln. Dies ist nur eine reguläre GET-Anforderung, die wiederholt wird.

Dieser jQuery-Code ist nicht getestet, aber Sie haben die Idee:

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);
}

Kurzes Abrufen reduziert die Anzahl gleichzeitiger Verbindungen, indem stattdessen wiederholtes Abrufen (Anfordern) verwendet wird. Wie immer ist der Nachteil einer kurzen Abfrage die Verzögerung beim Abrufen neuer Nachrichten. Dies ist jedoch analog zum wirklichen Leben, daher sollte es keine große Sache sein. (Wenn Sie in der letzten Woche nicht angerufen wurden, werden Sie wahrscheinlich in den nächsten fünf Minuten nicht angerufen. Daher wäre es dumm, alle fünf Minuten Ihr Telefon zu überprüfen.)

0
Victor Stoddard 18 Jän. 2015 im 02:03

Versuchen Sie Folgendes: http://socket.io/

Es kann Websockets, lange Abfragen, Flash-Sockets und mehr ausführen! Und sie behaupten, dass es IE 5.5 unterstützt.

2
Popcorn 10 Okt. 2012 im 13:31