优化网络带宽使用:重用字符串

时间:2015-03-08 03:35:00

标签: c++ theory

我会尽量做到尽可能简短。

我目前正在开发一款小型,现场直播的MMO"并希望减少主机的带宽使用 - >客户端。

最昂贵的是字符串的使用,这些字符串在很大程度上不断重复并发送给客户。由于它们的性质,它们的名称或价值不同,但它们只是略有不同,但其余的则重复出现。

我知道我已经确定已经完成了,但无法找到任何例子。

基本上,这些重复的字符串可以分配一个"字符串代码" ,然后变量,然后发送到客户端。客户已经有足够的信息填写空白,可以说,根据分配给每个玩家的身份号码

例如,在玩家姓名的情况下......

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

变得..

1 23 75 8 // only 6 bytes needed 

其中..

1,是"字符串代码"
23,是Supanova的玩家ID,(客户已经为该玩家提供了名称) 75,是整数变量 8,是Angus的另一个玩家ID

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

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

我不确定我是否已经解释得太好了,它已经迟到了,听起来好多了......

1 个答案:

答案 0 :(得分:0)

您可能会使用“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个字节)。但是,如果它是整个世界的“绝对”ID,则PlayerId只需要很大。您还可以在当前游戏中使用“相对”ID,在这种情况下,单个字节足以支持每位玩家256名玩家。在这种情况下,你总共可以获得7个字节。

上面没有任何新颖的内容:它是非常典型的网络消息格式。注意字节序。您可以考虑使用合适的库,例如Cap'N'Proto