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

时间:2017-04-01 02:17:35

标签: c++ memory-management voxel

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

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

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

感谢阅读!

2 个答案:

答案 0 :(得分:5)

有可能,例如: -

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

这是一个链接(我是问的人),我学习了如何在一个块中分配内存  How to use void* as a single variable holder? (Ex. void* raw=SomeClass() )

但是,我对你想要做的事情略有不同意见。

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

传统推荐:在之前(过早地)对其进行优化。

答案 1 :(得分:0)

以下是其他一些想法:

  • 有一个8位的blockID,但每个部分都有一个扇区ID,每个部分使用它自己的" palette"的块ID。基本上你可以有128"普通"可以在任何地方找到的瓷砖,以及128个特定区域的瓷砖。这种解决方案适用于许多游戏,特别是对于移动平台,因为您可以指定一组完整的资产,并且只根据"调色板"加载每个特定级别中引用的资产。该级别的资产。

和/或比块类型更好的想法:

  • 使用oct-tree作为块。然后,未区分的区域将仅具有整个节点的一个BlockID。被挖出的空白空间不必拥有许多节点(无论何时更改块,您都要检查它是否可以合并到更高级别),这将弥补创建的额外节点区域开放。

oct-tree的理论最大内存比blockID的实体块多一点,但实际使用将具有大的区域,实际上是固体块类型(例如空气)。渲染一个oct-tree会更快,因为你可以跳过任何空白节点,比单步执行所有切片以检查它们是否为空。

您可以创建一个包装器,以便oct-tree可以与完全定义的blockID的3D数组互换,例如,您可以通过函数调用为任何节点提取blockID。然后添加函数来设置blockID,根据需要进行节点的拆分和合并。