一种避免浪费记忆的方法

时间:2011-04-06 16:12:17

标签: c# xna

目前,我已经建立了一个系统,我在一个结构中记录一个游戏手柄状态并将其存储在一个状态列表中,以记录视频游戏持续时间内的输入。垫的完整状态每帧占用192位,但这有点浪费。例如,如果没有按下打击垫上的模拟触发器,它们仍然需要存储32位。显然,我希望节省一些空间。

我曾尝试将此设置为NULL,但它似乎对系统在匹配结束时保存的二进制文件的大小没有影响。

在您只需要记录或保存某些值但保留数据结构完整性的情况下,有哪些替代方案可用?

编辑:

我想我找到了解决方案;各种各样的。之前我尝试通过在struct中使用System.Nullable覆盖标准float来尝试将值设置为NULL。我的想法是在结构中将其设置为NULL值将序列化得更小。我的印象是NULL被记录为4位。它可能更多,它可能是。无论如何,我之前的代码有一个相当明显的错误,所以我已经回去修复它了。现在我得到了更小的重放,而且准确性似乎也一样好,所以我假设NULL技巧正在做正确的事情。

4 个答案:

答案 0 :(得分:2)

我认为不是在结构中。您可能需要更复杂的协议。

例如(非常粗糙,没有想过)(WHAT 3xough):

第一个字节包含8个按钮的状态,每个按钮一个位。如果一个按钮的位设置为1,则客户端(我现在将其称为客户端)期望该按钮的更多特定数据,如方向等,按特定顺序。

答案 1 :(得分:1)

可以拆分结构和/或使用压缩。

但主要的节省可能是在游戏期间保存,而不是最终。

答案 2 :(得分:1)

这就是你要做的。

使用比特流只能写出有所作为的信息位。在你有大量稀疏数据的情况下,你先写出一个位掩码,它会告诉你以下哪些位包含数据。

这样,像向量这样的东西可以减少到只有3个零位。如果向量为空/零。如果向量中只有一个组件有效,那么就是3位+只有该组件的大小。除此之外,你当然可以添加压缩,但是,在某些时候,比特的分布(当你切割它时)变得非常均匀。这使得通用压缩方法不太理想,甚至可能会增加输出的大小。

你所做的就是你经常把这些东西写到磁盘上,这样你就不会在内存中留下一大笔钱。

答案 3 :(得分:0)

你可以只储存三角洲吗?在许多情况下,这给出了很好的压缩。

对于您的位类型状态,它不会改变大小,只会改变含义。

对于你的浮点类型,在大多数情况下它减少到1位,而在其他情况下只增加1位。