7

こんにちは私はnode.jsとsocket.ioを使用してリアルタイムマルチプレイヤーゲームを構築しようとしています。

さて、コーディングの観点からそれ自体を実装することはそれほど問題にはなりませんが、従来のhttp要求/応答Webプログラミングモデルから来ているので、トラフィックとサーバーの負荷の観点からこれがどれほど高価になるかわかりません。基本的に、ゲーム中、プレーヤーのブラウザはリアルタイムのマウス入力イベントを追跡し、同じゲーム内の他のすべてのプレーヤーにそれらをブロードキャストし続ける必要があります。

これが例です。たとえば、アバターが画面上のマウスポインターの周りをたどり、画面上の残りのプレーヤーにリアルタイムでブロードキャストする必要があるとします。私は次のようなことをします:

// client side
$(document).on("mousemove", function(event){
    io.emit("coordinate", {x: event.pageX, y: event.pageY});
});

およびサーバー上:

// server side
io.sockets.on("connection", function(socket){
    ...
    socket.on("coordinate", function(coordinate){
        socket.get("username", function(err, username){
            socket.broadcast.emit("move", {username: username, coordinate:coordinate});
        });
    });
    ...
});

これは機能するはずですが、これにはブラウザが1秒あたり数回のイベントをサーバーに送信する必要があり、その後、同じゲーム内の残りのプレーヤーにそれらをブロードキャストする必要があります。これが意味することを心配しています。ただし、送信されるデータの各フラグメントのサイズはそれほど大きくありません(基本的にはx座標とy座標です)。これが高すぎると、このゲームがどんなに素晴らしいものであっても、私はそれを出荷できないと思います。誰かが私を教えてもらえますか?ありがとうございました。

[編集]明確にするために、私はこのアーキテクチャをより効率的にする方法について質問していません。このタイプのシステムがシステム負荷(およびメンテナンスコスト)の観点から十分に現実的かどうかを知りたいだけです。通常のWebサービスの場合、ページビュー数を見るだけでコストを見積もることができますが、WebSocketはまったく新しい分野です。の、だから私は聞きたかった。

4

5 に答える 5

5

警告:以下のすべての数値は推定値であり、かなりの数の場所にオーバーヘッドがありますが、どこかから始めることができます。

接続間でデータをやり取りするだけの場合は、サーバーがボトルネックになる可能性は低いと思われます。帯域幅(プレーヤー側および/またはデータセンター側)で最初の壁にぶつかると思います。

各ユーザーが1秒間に平均25回マウスデータをプッシュしていると仮定すると、各ユーザーは1秒間に25回プレーヤーをダウンロードすることになります。各マウスの動きのメッセージが100バイトで、プレーヤーが20あると仮定すると、(単純に)毎秒50kbまでダウンロードしていることになります。これは非常に高いですが、達成可能です。オーバーヘッドがあるので素朴に言いますが、まともな接続でそれは達成可能だと感じます。

ダウンロード帯域幅はプレーヤーの数に比例するため、100プレーヤーでは、クライアント側で250kb / s、サーバー側で22Mb/sのようになります

より多くのプレーヤーが必要な場合は、メッセージのトリミング、データ圧縮、マウスのサンプリング速度の制限など、最適化を見つける必要があります。

于 2012-10-26T17:52:30.340 に答える
3

100万ドルの質問は次のとおりI just want to know if this type of system is realistic enough in terms of system load (and maintenance cost)です。これは非常に相対的なものだと思います。コーディング、ハードウェア、ユーザー数に関連します。

レオンの提案は良いです。マウスのクリックを追跡するだけで、マウスの動きを追跡しないでください。この種のゲームでは、リクエスト/レスポンスを減らすためのあらゆる戦略を歓迎します。

あなたの質問に答えて、私はもう一度言いました、それは相対的であり、あなたのstartegy(node.jsとwebsocketsを使用)は良さそうです、そしてそれは同時に1.000ユーザーのために働くことができましたが、1.000.000のために働くことができませんでした、しかし同じコード、より優れたハードウェアは、1.000、1.000.000、1.000.000.000のユーザーで機能する可能性があり、インフラストラクチャの問題です。コードが優れていることがわかっている場合、問題はハードウェア、帯域幅などにあるため、前提はだと思いますbe carefully in your code to mantain the system lightwheigt(これについては後で対処できます)。

于 2012-10-25T17:48:00.650 に答える
1

アバターは実際にマウスを追いかけますか、それともクリックされたマップ上の場所に移動しますか?後者の場合、クリック位置をサーバーに送信するだけでよく、サーバーはアバターのウェイポイントと移動速度をクライアントにブロードキャストするだけで済みます。

これには、管理する必要のあるオブジェクトとプレーヤーの数に関してまだ制限がありますが、サーバーは、複数のアバターとオブジェクトに対して1/10秒または1/4秒のアクションを収集し、それらをバンドルとして共有できます。これにより、ネットワーク、サーバー、およびクライアントの負荷が軽減されます。

于 2012-10-21T07:57:28.647 に答える
1

私は非常に似たようなことをしました...

すべてのプレーヤーが独自の速度(できれば毎秒約30フレーム)でサーバーにデータを送信します。サーバーは各プレーヤーからデータを収集し、新しい状態(プレーヤーのマウスの位置)を設定します。サーバーには毎秒30フレームで実行されるタイマーがあり、すべてのプレーヤーのマウス位置ですべてのプレーヤーに単一のメッセージを送信します。ペイロードが大きくなりますが、1秒あたり30パケットしか送信されません。ノードや、最新のブラウザでは問題ありません。

あなたのゲームで頑張ってください!

ダン

PS-覚えておいてください、あなたはスピードのためにデザインしなければなりません!

于 2012-10-28T03:07:15.783 に答える
1

このように考えてください。

リアルタイムの更新を使用して大規模なマルチプレイヤーゲームを本当に構築したい場合は、ここの統計によると、最善の策はWebSocketです。(socket.ioはフォールバックを提供する便利なライブラリですが、主にWebSocketを使用するように構成する必要があります。)

リチャードはいくつかの確かな見積もりをしました。ただし、考慮する必要のある追加の事項が2つあります。

  • 開いている接続の最大数(ulimitの場合はgoogle)
  • 並列化(node.jsは単一のスレッドで実行され、これは将来変更されることはないでしょう。変更をブロードキャストする場合、ゲームで約O(n)のパフォーマンスが許容されますか?)
于 2012-10-29T03:43:22.303 に答える