我正在制作一个 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 字节数据包发送?
为什么对尺寸如此着迷?我知道这没关系,但我将它用于学习体验,在未来的游戏中我将使用它来降低延迟......我知道国际象棋不需要低延迟。
最佳答案
按照 RFC 的指示,按照框架构造的数据包:
https://www.rfc-editor.org/rfc/rfc6455#section-5
每个消息片段的开销最多为 10 个字节或更少。每个片段发送多少字节由有效负载长度(帧的一部分)决定。不过,碎片可能会很大。除非您要发送非常大的消息,否则我认为这不会成为问题。
根据分帧和分段的工作方式,如果分帧 + 数据刚好在 100 字节左右,则不应发送/接收 1024 字节的数据。
我的猜测是某些实现可能会有细微差别,但您不应该过分关注这样的细节,除非您开始在我们的应用程序中看到压力问题。
“过早的优化是万恶之源”Donald Knuth
另一个细节:如果您真的想获得非常低的延迟,则必须开始研究使用 UDP 或多播等方法。问题是:websockets 不支持这些。减小数据包大小并不是网络唯一重要的事情,而只是其中的一部分……根据我使用 socket.io 的经验,CPU 在带宽之前成为小消息的瓶颈,RAM 也可能受到重创在带宽之前以及消息处于低千位时。当然,这完全取决于您的应用,我只是在谈论经验。
关于javascript - 低延迟 websocket html 5 游戏的数据包大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12738853/