gpt4 book ai didi

c++ - 优化网络带宽使用 : Reusing strings

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:51:00 26 4
gpt4 key购买 nike

我会尽量简明扼要..

我目前正在开发一个小型的实时“MMO”,并希望减少主机 -> 客户端的带宽使用。

其中成本最高的是字符串的使用,在大多数情况下,字符串会不断重复并发送给客户端。由于它们的性质(无论是名称还是值),它们仅略有不同,但其余部分是重复的。

我有一个想法,我确定已经完成了,但找不到任何例子。

基本上,这些重复的字符串,可以分配一个“stringcode”,然后是变量,然后发送给客户端。客户已经有足够的信息来填补空白,可以说,基于分配给每个玩家的 ID 号

例如,在球员姓名的情况下..

"Supanova transfers 75 crew to Angus" // 35 bytes

变成..

1 23 75 8 // only 6 bytes needed 

哪里..

1,就是“stringcode”
23,是Supanova的玩家ID,(客户端已经有这个玩家的名字
75,是整型变量。
8,是安格斯的其他玩家ID

理论上,我可以找到所有发送给客户端的字符串,并将它们存储在客户端,这是我希望避免的,因为这是一个痛苦的过程。

或者,创建一个排序字典,在运行时,为每个新字符串分配一个“stringcode”值,变量的数量,很可能需要类型的顺序。主机将发送仅包含“stringcode”和变量的数据包,如果客户端还不知道该“stringcode”的字符串的上下文,请请求该字符串,然后它可以将其拼凑起来。

不确定我是否解释得很好,时间已经晚了,但在我脑海中听起来好多了......

最佳答案

您可能对“字符串代码”的想法有所了解。它类似于某些压缩算法中所做的:构建一个字典来表示具有短 ID 的常见字符串。

但是,关于您的实际示例:

"Supanova transfers 75 crew to Angus" // 35 bytes

不要将其视为“字符串”,而应将其视为“命令”或“消息”。然后消息是这样的结构或类:

enum class MessageType : uint8_t { Transfer, /*...*/ };

struct BaseMessage { // message header
MessageType messageType;
} __attribute__((packed));

struct TransferMessage : BaseMessage {
PlayerId playerIdFrom;
PlayerId playerIdTo;
int32_t amount;
} __attribute__((packed));

如果 PlayerId 是四个字节,那么整个东西仍然是 13 个字节(如果不打包则为 16 个)。但是 PlayerId 只有在它是整个世界的“绝对”ID 时才需要很大。您还可以在当前游戏中使用“相对”ID,在这种情况下,单个字节足以让 256 名玩家玩一场游戏。在这种情况下,您总共可以使用 7 个字节。

上面没有什么新奇的:这是非常典型的网络消息格式。注意字节顺序。您可以考虑使用合适的库,例如 Cap'N'Proto .

关于c++ - 优化网络带宽使用 : Reusing strings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28922798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com