首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化网络带宽使用:重用字符串

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

Stack Overflow用户
提问于 2015-03-08 11:35:00
回答 1查看 80关注 0票数 2

我会尽量简明扼要..

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

其中最昂贵的是字符串的使用,在大多数情况下,这些字符串会不断重复并发送给客户端。由于它们的性质不同,它们只有很小的区别,无论是名称还是值,但其余的都是重复的。

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

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

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

代码语言:javascript
复制
"Supanova transfers 75 crew to Angus" // 35 bytes

变成了..。

代码语言:javascript
复制
1 23 75 8 // only 6 bytes needed 

在哪里..。

1,是“字符串码”

23,是Supanova的玩家ID,(客户端已经有了这个玩家的名字

75,是整数变量。

8,是Angus的另一个玩家ID

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

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

不知道我是否解释得太好了,现在已经很晚了,在我的脑海里听起来好多了……

EN

回答 1

Stack Overflow用户

发布于 2015-03-08 11:52:16

你可能用你的“字符串代码”的想法找到了一些东西。这与一些压缩算法中的操作类似:构建一个字典来表示具有短ID的常见字符串。

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

代码语言:javascript
复制
"Supanova transfers 75 crew to Angus" // 35 bytes

不要将其视为“字符串”,而应将其视为“命令”或“消息”。则消息是一个结构或类,如下所示:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28922798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档