4

Node と Socket IO ,express を使用してマルチプレイヤー レーシング ゲームを試しています。そこで、ノード サーバーとクライアント間のレイテンシを確認するために、簡単な例を試してみました。client にドラッグ可能な画像があります。1 つのクライアントでイメージ エンター コードを移動すると、すべてのクライアントで移動する必要があります。したがって、基本的に画像を移動するときは、画像の位置をjson形式でノードサーバーに送信し、そこからすべてのクライアントにブロードキャストします。その時点から約 300 ミリ秒の遅延があります。以下は結果です。

クライアント 1 がサーバーにデータを送信: 286136 (タイムスタンプ) サーバーが受信: 286271

Client2 の受信データ: 286470 Client3 の受信データ: 286479 Client4 の受信データ: 286487 Client5 の受信データ: 286520

client1 から client5 への移動間のレイテンシは 384 ミリ秒です。レーシング ゲームには高すぎる.. これが私のサーバー コードです。

var app = require('express').createServer();  
var io = require('socket.io');  
var http = require('http');  
var http_server = http.createServer();  
var server = http.createServer(app);  
server.listen(3000);  

var socket = io.listen(server,{ log: false });

socket.sockets.on('connection', function (client) {    
  client.on('message', function (data){  
        console.log("data arrived to server",new Date().getTime());  
// Below  both statements are giving same latency between the client 1 and client 5  
        client.broadcast.emit('message',data);    
        //socket.sockets.emit('message',data);  
  });  
});  

1) サーバーコードを最適化して待ち時間を短縮する方法はありますか?
2) node と websockets を使用した場合、これは予想されるレイテンシですか?
3) ソケット io はデータを非同期的にブロードキャストできませんか (つまり、同時に) ?

ありがとう

4

2 に答える 2

4

このようなリアルタイムゲームをいくつか作成しました。1 つはマルチプレイヤーの Asteroids でした (全員が小惑星を撃っていた、協力プレイ)。すばらしい応答時間でした -- しかし、すべてのクライアントに大量のデータを「スパム送信」していたわけではありません -- これは問題かもしれません。クライアント上でゲームを 60 fps で実行し、サーバーが 30 fps で物理演算を処理するようにしました。すべてのクライアントが Chrome の場合にのみ機能しました (つまり、Web ソケットがありました)。現在、ほとんどのブラウザーは Web ソケットをサポートしています。最初にソケットがあることを確認します。2 つ目は、すべてのクライアントに送信するデータ量が多すぎないことです。1 つの方法は、既知のレート (毎秒 30 フレームなど) でサーバー上の物理を処理することです。また、クライアント上で物理演算を処理します。エンド ユーザーの変更を 30 fps 境界ですべてのクライアントに送信します (データを取得するときではありません)。小惑星の場合、これは次のことを意味します。

  1. すべてのプレイヤー船の場所、およびその船に関するすべて (向き、浮遊方向、ブーストがオンまたはオフの場合)
  2. すべての弾丸がどこにあるか (位置、方向、速度、誰が発射したか)
  3. すべての小惑星がどこにあるか (位置、方向、速度)
  4. 1 秒間に 30 回、物理演算を実行し、画面を再描画します

今 ...

  1. クライアントがリクエストを出すと (私の船を右に回転させるなど) -- クライアントはそのデータをサーバーに送信します (ローカルでは処理しません)。
  2. サーバーがユーザーリクエストを受け取ると、次の「ティック」で処理するためにリクエストをキューに入れます
  3. サーバー ティック (1 秒間に 30 回): キューに入れられたすべてのイベントを処理します。
  4. 船のローテーションのリクエスト: 実際に船をローテーションします。船のデータを全員にブロードキャストします (位置、向き、速度 ...)
  5. クライアントがサーバーから更新イベントを取得すると、その新しい「正しい」データがサーバーからローカル スペースに詰め込まれます。注: クライアントが 30 fps ですべてを処理できない場合、船はデータが送信されるときに正しい場所に「ジャンプ」します。
于 2012-10-16T16:58:34.720 に答える
0

Node と Socket.io - https://github.com/ecdeveloper/wallattackを使用して作成された私のオンライン マルチプレイヤー ゲームを確認できます。コードは本当に簡単です。

http://wallattack.ecdeveloper.com/で利用可能なデモもあります。

于 2013-03-21T11:19:42.633 に答える