4

我正在制作一个 HTML 5 国际象棋游戏。我用一个长度(大小)为 64 的无符号 8 位二进制数组来表示棋盘。因为国际象棋棋盘上有 64 个位置。

var board = Uint8Array(64);

每个棋子通过(显然)8 位无符号整数在棋盘上表示。然后在客户端上,有一个将片段的二进制表示与文本字符串相关联的映射,例如:

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

数据是通过socket.io连接发送的(假设我们使用的是websockets),我认为是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

另一个细节:如果你真的想要非常低的延迟,你就必须开始研究使用 UDP 或多播之类的东西。问题是:websockets 不支持这些。减少数据包大小对于网络来说并不是唯一重要的事情,而只是其中的一部分……根据我对 socket.io 的经验,CPU 成为带宽之前小消息的瓶颈,RAM 也可能会受到很大的打击在带宽之前以及当消息处于低千位时。当然,这完全取决于您的应用程序,我只是在谈论经验经验。

于 2012-10-05T04:20:54.573 回答