- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我会尽量简明扼要..
我目前正在开发一个小型的实时“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/
我在 WebApi 项目中使用 DryIoc。默认重用设置为 Reuse.InWebRequest。在某些情况下,我需要在请求期间解析新实例。使用 Reuse.InCurrentScope 时,我可以
问题:当 Collection View 单元格滚动到屏幕外并重新使用时,对 Collection View 单元格的引用会发生什么情况?我在不使用“出队”的情况下提供细胞的所有尝试都失败了。有没有办
有什么想法可以解决如下所示的问题吗?根据我在网上找到的信息,它与重用 tensorflow 范围的问题有关,但没有任何效果。 ValueError: Variable rnn/basic_rnn_ce
去年,我参加了C++的数据结构类(class),因此以模板代码实现了所有主要的数据结构。我将所有内容都保存在闪存驱动器中,因为我觉得在生活中的某个时刻,我会再次使用它。我想我最终编程的东西将需要B树,
几年前,有人告诉我一项关于代码重用的研究。显然,发现程序员在搜索要重用的代码时平均有 7 分钟的时间。如果他们在那个窗口中没有找到适合他们需要的代码,他们就会编写自己的代码。 这是在需要仔细管理代码以
我一直是一个糟糕的程序员,因为我正在做复制和粘贴。一个例子是,每次我连接到数据库并检索记录集时,我都会复制以前的代码并编辑,复制设置 datagridview 的代码并进行编辑。我知道短语代码重用,但
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
关闭。这个问题需要多问focused 。目前不接受答案。 已关闭 3 年前。 已锁定。这个问题及其答案是locked因为这个问题是题外话,但却具有历史意义。目前不接受新的答案或互动。 任何代码都可以以
我通常会维护代码片段,我可以在 Wikidpad 个人 wiki 中重新使用这些代码片段,并带有一个小索引页面,可以将我带到我想要的任何代码。 我想与我的团队分享这些片段,并正在寻找简单的方法来做到这
我有以下路线,id 是一个可选参数,因此用户可以加载信息,或者如果没有提供 id,他们可以添加信息。我希望能够重用组件,这样页面就不必重新加载(在 ngOnInit 中调用 api),但是因为它们是两
我想对多个数据表应用相同的聚合,而不需要重写聚合方案。 考虑 dt1 <- data.table(id = c(1,2), a = rnorm(10), b = rnorm(10), c = rnor
我的公司有两到三个使用大量通用代码的 Web 应用程序——自定义 MVC 框架、实用程序类、JavaScript 库等等。 我们不想在每个应用程序中复制所有这些代码,因为我们最终会使用它的几个略有不同
许多个月前,我开始将我的音乐存储为 MP3。我疯狂地下载,然后将它们全部转储到一个文件夹中。在收集了数千首歌曲后,我一团糟。在我的空闲时间整理了所有音乐两年后,我已经把它放到了我图书馆的“D”部分。我
我正在尝试学习specflow,现在。 目前我有 2 个功能文件。 在第二个功能文件中,我重用了第一个功能文件中的一个步骤。 Specflow 自动识别第一个功能文件中的步骤,当 Specflow 为
有时我会偶然发现我想表达“请使用最后一个参数两次”的问题,例如为了编写无点样式或避免使用 lambda。例如。 sqr x = x * x 可以写成 sqr = doubleArgs (*) wher
这个问题已经有答案了: Javascript: how to pass found string.replace value to function? (3 个回答) 已关闭 7 年前。 我有一个功能
我想查找字符串中出现的字符(如果它们出现在某个“标记”字符之前或之后)。 所以我的标记是-,字符串是“a b-c d”。我想按顺序查找 b 和 c。 我试过了 re.findall(r'(-[a-z]
这个问题在这里已经有了答案: How to set variable reuse back to False in Tensorflow? (2 个答案) 关闭 6 年前。 有没有办法取消设置变量范
我会尽量简明扼要.. 我目前正在开发一个小型的实时“MMO”,并希望减少主机 -> 客户端的带宽使用。 其中成本最高的是字符串的使用,在大多数情况下,字符串会不断重复并发送给客户端。由于它们的性质(无
我读到 ThreadPoolExecutor 有线程池,这个池注定要降低创建新线程的成本(至少我是这样理解下面的短语): When you send a task to the executor, i
我是一名优秀的程序员,十分优秀!