4

HTML 5 のチェス ゲームを作成しています。長さ (サイズ) が 64 の符号なし 8 ビット バイナリ配列でボードを表します。チェスのボードには 64 の位置があるためです。

var board = Uint8Array(64);

各チェスの駒は、(明らかに)8ビットの符号なし整数を介してボード上で表されます。次に、クライアントには、ピースのバイナリ表現をテキスト文字列に関連付けるマップがあります。

var pieceMap = { 01: 'BlackKnight', 112: 'WhitePawn', 6: 'BlackRook' ... }

データはsocket.io接続を介して送信されます(Webソケットを使用していると仮定しましょう)、TCPと思いますか?質問は次のとおりです 。TCP は、私がフィードしたデータと同じくらい小さいパケットを送信しますか (TCP オーバーヘッドを使用)、または TCP には最小パケット サイズがあり、200 バイト パケットを 1024 バイト パケットとして送信しますか?

なぜそんなにサイズにこだわるの?私はそれが問題ではないことを知っていますが、私はこれを学習体験に使用します。将来のゲームでは、これを使用してレイテンシを下げます... チェスは低レイテンシである必要はないことを知っています.

4

1 に答える 1

4

RFC の指示に従って、フレーム化されたパケット:

https://www.rfc-editor.org/rfc/rfc6455#section-5

オーバーヘッドは、メッセージごとに最大 10 バイト、またはメッセージ フラグメントごとにそれ以下です。フラグメントごとに送信されるバイト数は、ペイロードの長さ (フレーミングの一部) によって決まります。ただし、フラグメントはかなり大きくなる可能性があります。非常に大きなメッセージを送信しない限り、問題にはならないと思います。

フレーミングとフラグメンテーションの仕組みによると、フレーミング + データが約 100 バイトの場合、1024 バイトのデータを送受信するべきではありません。

私の推測では、いくつかの実装ではわずかな違いでそれができる可能性がありますが、アプリケーションでストレスの問題が発生し始めない限り、そのような詳細についてあまり気にする必要はありません。

「時期尚早の最適化は諸悪の根源である」Donald Knuth

もう 1 つの詳細: レイテンシを非常に低くしたい場合は、UDP やマルチキャストの使用などを検討する必要があります。問題は、websockets がこれらをサポートしていないことです。パケット サイズを縮小することは、ネットワークにとって重要なことだけではなく、その一部にすぎません...そして、socket.io での私の経験から、CPU は帯域幅の前に小さなメッセージでボトルネックになり、RAM も大きな打撃を受ける可能性があります。メッセージが低キロバイトである場合と同様に、帯域幅の前。もちろん、これはアプリケーションに完全に依存し、経験的な経験について話しているだけです。

于 2012-10-05T04:20:54.573 に答える