c++ 12位变量,我该怎么做?

c++ 12bit variable, how can I do this?

我正在构建一个体素引擎,所以我担心内存使用,使用 12 位而不是 16 位块 ID 可以节省大量内存。我有一个方块 ID 的 3D 数组,每个 ID 都有一个静态配置。

我不确定实现此目标的好方法是什么。有没有办法只获取一块原始内存并自己管理它,这是个好主意吗?我可能 运行 有什么问题吗?有更好的方法吗?

我对 c++ 有一些经验,但我的大部分时间都花在 Java 和 c# 上。

感谢阅读!

有可能,例如:-

  • 保留一个8字节的变量(存储5个变量,每个12位),或者
  • 使用 char[k] 保留 k~ceiling{(12*n)/8.0f},然后使用 union 等....

这里是link(我就是问的人)学习的关于块分配内存的知识。

但是,我不太同意你的做法。

据我所知,您的方法的缺点是:-

  • 一些错误:更难实现。
  • 对齐问题:性能可能更差。
    看到这个:Memory alignment : how to use alignof / alignas?

传统建议: 在(过早地)优化它之前对其进行概要分析。

这里有一些其他想法:

  • 有一个 8 位块 ID,但每个部分都有一个扇区 ID,每个部分使用它自己的 "palette" 个块 ID。基本上你可以有 128 "common" 个可以在任何地方找到的图块,以及 128 个区域特定的图块。这种解决方案适用于许多游戏,尤其是移动平台,因为您可以指定一整套资产,并且根据该关卡的 "palette" 资产,仅加载每个特定关卡中引用的资产。

And/or 比限制块类型更好的主意:

  • 对块使用八叉树。一个没有区分的区域将只有一个 BlockID 用于整个节点。被挖出的空 space 不需要有很多节点(每当更改块时,您都会将其与更高级别进行检查以查看是否可以合并),这将弥补作为区域创建的额外节点打开了。

oct-tree 的理论最大内存比 blockID 的固体块多一点,但实际使用将有大面积,实际上是固体块类型(例如空气)。渲染八叉树会更快,因为您可以跳过任何空节点 space 比遍历所有图块以检查它们是否为空要快得多。

您可以制作一个包装器,以便八叉树可以与您完全定义的 3D 块 ID 数组互换,例如您可以通过函数调用为任何节点提取 blockID。然后加入设置blockIDs的函数,根据需要进行节点的拆分和合并。