我会尽量简明扼要..
我目前正在开发一个小的,活的"MMO“,并希望减少主机->客户端的带宽使用。
其中最昂贵的是字符串的使用,在大多数情况下,这些字符串会不断重复并发送给客户端。由于它们的性质不同,它们只有很小的区别,无论是名称还是值,但其余的都是重复的。
我有一个想法,我确信已经完成了,但找不到任何示例。
基本上,这些重复的字符串可以被分配一个"stringcode“,然后是变量,然后发送到客户端。客户已经有了足够的信息来填补空白,可以说,是根据分配给每个玩家的id号。
例如,在球员姓名的情况下..
"Supanova transfers 75 crew to Angus" // 35 bytes变成了..。
1 23 75 8 // only 6 bytes needed 在哪里..。
1,是“字符串码”
23,是Supanova的玩家ID,(客户端已经有了这个玩家的名字
75,是整数变量。
8,是Angus的另一个玩家ID
理论上,我可以找到所有发送到客户端的字符串,并将它们存储在客户端上,这是我希望避免的,因为这是一个痛苦的过程。
或者,创建一个排序字典,在运行时为每个新字符串分配一个“string order”值,变量的数量,以及很可能需要的类型的顺序。主机将发送只包含“string can”和变量的数据包,如果客户端还不知道该“string can”的字符串的上下文,则请求该字符串,然后它可以将其拼接在一起。
不知道我是否解释得太好了,现在已经很晚了,在我的脑海里听起来好多了……
发布于 2015-03-08 11:52:16
你可能用你的“字符串代码”的想法找到了一些东西。这与一些压缩算法中的操作类似:构建一个字典来表示具有短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是4个字节,那么整个代码仍然是13个字节(如果没有打包,则为16个字节)。但是,只有当PlayerId是整个世界中的“绝对”ID时,它才需要很大。您还可以在当前游戏中使用“相对”ID,在这种情况下,每个游戏一个字节就足以容纳256名玩家。在这种情况下,您可以使用总共7个字节。
上面没有什么新意:它是非常典型的网络消息格式化。注意字符顺序。您可以考虑使用合适的库,如Cap'N'Proto。
https://stackoverflow.com/questions/28922798
复制相似问题