11

私はこれをできるだけ短くしています。

私がこれまでに行ったこと:私が持っているゲームは、setTimeoutまたはを使用してJavaScriptで実行されますsetInterval。フラッシュなど特別なものではありません。私がこれまでに行ったのは、テスト実行のように(よりよく理解できるように)、PHPページにリクエストをできるだけ速く送信し続けるためのループAjaxであり、PHP$_GETはリクエストからURLを読み取ります。次に、PHPはp1.htmlというファイルを編集します$_GET。これは単にプレーヤー1のx軸とy軸の座標です。つまり、プレーヤー2のブラウザーでは、上記のことをほぼ実行し、Ajaxリクエストを受信すると、プレーヤー1の座標を受信します。JavaScriptはそれを実行し、プレーヤー1をプレーヤー2のブラウザーに移動します。それは私がすでに自分で作ったものです、

そうは言っても、これまでに作ったものですが、オンライン格闘ゲームやリアルタイムの横スクロールゲームのようにしたければ、これは十分な速さではありません。それが私が助けを必要としていることです。私はw3schools.comでたくさんのことを知っていますが、この仕事を成し遂げる方法がわかりません。それはおそらくそれです。ブラウザ1が必要なのは、ブラウザ2にデータを取得するためで、実際には「1,100,200」またはそれより少し長く、ブラウザ2にそのデータをJavaScriptの変数(x="received data";のようなもの)として読み取らせるだけです。残りはJavaScriptが行います。

自分で必要なものはすべてプログラムできると思いますが、ポイントAからポイントBに1秒間に50回のようにデータを送信する場合、私はそれについて何も知りません。名前すらありません。そして最後に、URLと例は非常に素晴らしいでしょう(より明確にするために)。特にそれがすでにw3schools.comにあり(例を含む)、私がそれを見逃した場合は特にそうです。

4

6 に答える 6

16

WebSocketを使用できます

(AJAXに対する)WebSocketの利点は、基本的にHTTPオーバーヘッドが少ないことです。接続が確立されると、それ以降のメッセージパッシングはすべて、新しいHTTP要求/応答呼び出しではなく、ソケットを介して行われます。したがって、WebSocketは単位時間あたりにはるかに多くのメッセージを送受信できると想定します。それが本当であることがわかります。しかし、ミックスにレイテンシーを追加すると、非常に厳しい現実があります。

WebSocketはAJAXよりも約10〜20%高速です

ソース

phpでajaxを使用するとどうなりますか

  1. Apacheサーバーへの新しい接続を開きます
  2. Apacheがphpスクリプトを探して起動するよりも
  3. これで、phpスクリプトがサーバーに接続してクエリを実行し、結果を返します。

しかし、WebSocketが行うことは、2つの接続プロセスを排除し、サーバーにメッセージを送信するだけです。サーバーはすでにSQLサーバーに接続されています

もう1つの利点は、クライアントとサーバー間の接続が開いたままになり、サーバーがクライアントにメッセージを送信できることです。ajaxでは毎回calする必要があります

于 2012-10-10T08:01:24.337 に答える
15

答えは簡単です: websocketsを使用してください。それらは、一見瞬時の相互作用のために双方向にデータを即座にプッシュすることを可能にします。それらは、遅くて重い(サーバーを含む)クライアントからデータをプルする必要をなくします。私のお気に入りのゲームで通知プッシュに使用されているソリューションであることに注意してください。

PHP の websockets に関するこの紹介に興味があるかもしれません。ただし、長い接続の処理やリアルタイム ゲーム (Go、node.js、java などを好むかもしれません) では、PHP は実際には最も効率的なソリューションではないことに注意してください。

于 2012-10-10T08:00:59.250 に答える
9

私は他のポスターに同意します: websockets はあなたが使うべきテクノロジーです。唯一の欠点は、バージョン 10 より前の Internet Explorer では Websocket がサポートされていないことです。これは現在 Windows 8 でのみ使用でき、Windows 7 より前の Windows バージョンでは使用できません。Vista および XP で IE ユーザーをサポートする場合、AJAX または Flash を使用したフォールバックが必要です。

しかし、別の問題が発生する可能性があります。

1秒間に50回のように、ポイントAからポイントBにデータを送信するため

頻繁にデータを送信する必要がある場合、プロトコルに何か問題があるようです。プレーヤーの位置が変わらなかった (プレーヤーが立っている) または一定の速度で変化した (プレーヤーが一方向に歩いている) 場合でも、20 ミリ秒の定期的な間隔でプレーヤーの位置を更新する予定はありますか? 位置を移動するのではなく、移動方向のみを変更することをお勧めします (左に移動を開始し、X:Y で左に移動を停止するなど)。そうすることで、多くの帯域幅を確保できます。

于 2012-10-10T08:09:27.673 に答える
6

正しく構築されていれば、ロング ポーリングajax リクエストは、非リアルタイム通信で問題なく機能します。そうは言っても、長いポーリングは「ハック」のようなものです。目的の接続を念頭に置いて構築されたものを探している場合は、間違いなくwebsocketsを選択する必要があります。

WebSockets は、ユーザーのブラウザーとサーバーの間で対話型通信セッションを開くことを可能にする高度なテクノロジです。この API を使用すると、メッセージをサーバーに送信し、サーバーをポーリングして応答を得ることなく、イベント駆動型の応答を受信できます。

インスピレーションを得るにはbrowserquestをチェックしてください- Mozilla の優秀な人々がソースコード全体を github で公開しています!

于 2012-10-10T08:24:57.603 に答える
2

これを試してください:http ://socket.io/

WebSocket、長いポーリング、フラッシュソケットなどを実行できます。そして彼らはそれがIE5.5をサポートすると主張している。

于 2012-10-10T13:31:18.027 に答える
0

Websocket は優れており、頻繁に言及されていますが、Android デバイスと 16% のブラウザーは Websocket をサポートしていません ( CanIUse.com )。多くのサーバー インストールでは、共有 LAMP セットアップを含め、websocket もサポートされていません。共有ホストを使用している場合、または幅広いサポートが必要な場合は、websockets は有効なオプションではない可能性があります。

ロング ポーリングは、WebSocket の唯一の有効な代替手段です。より幅広いサポートがあります (ほとんどすべてのサーバーとクライアントで動作するはずです) が、多くの同時接続を適切に処理できないサーバー (Apache など) では重大な欠点があります。もう 1 つの欠点は、接続しているユーザーの数に関係なく、多くの定期的なデータベース クエリ (おそらく 1 秒あたり数回) を実行する必要があることです。shm_attach()PHP のように共有メモリを使用すると、この負担を軽減できます。サーバー スクリプトは新しいメッセージを監視するため、見つかったメッセージは開いている接続を介してすぐに送信されます。クライアントはメッセージを受信し、新しいリクエストで長い接続を再開します。

Websocket を使用できない場合は、ロング ポーリングとショート ポーリングのハイブリッドを使用できます (以下を参照)。非常に長いポーリングを使用する必要はなく、多くのリソースを消費します。約 10 秒または 15 秒の一定の接続の後、それを閉じて、繰り返される通常の GET 要求である昔ながらの短いポーリングに切り替える必要があります。

この jQuery コードはテストされていませんが、次のように理解できます。

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

短いポーリングでは、代わりに反復ポーリング (要求) を使用して、同時接続数を減らします。いつものように、ショート ポーリングの欠点は、新しいメッセージを取得する際の遅延です。ただし、これは実際の生活に似ているため、大したことではありません。(過去 1 週間に誰かがあなたに電話をかけなかった場合、その人は今後 5 分間あなたに電話する可能性は低いので、5 分ごとに電話をチェックするのはばかげています。)

于 2015-01-18T00:09:17.113 に答える