我会尽量做到尽可能简短。
我目前正在开发一款小型,现场直播的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",请求字符串,然后它可以将它拼凑在一起。
我不确定我是否已经解释得太好了,它已经迟到了,听起来好多了......
答案 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。