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

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

本文关键字:我该怎么做 变量 12位      更新时间:2023-10-16

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

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

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

感谢您的阅读!

例如:-

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

这是一个链接(我是问的人),我学习了在块中分配内存。
如何使用 void* 作为单个变量持有者?(例如 void* raw=SomeClass() )

但是,我适度不同意您要做的事情。

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

  • 一些错误:更难实现。
  • 对齐问题:性能可能会更糟。
    看到这个 : 内存对齐 : 如何使用对齐/对齐?

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

以下是一些其他想法:

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

和/或比在块类型上吝啬更好的主意:

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

八进制树的理论最大内存略多于块ID的实心块,但实际使用将具有大面积,实际上是固体块类型(例如空气)。渲染八进制树会快得多,因为您可以跳过任何空白空间节点,比遍历所有磁贴以检查它们是否为空要快得多。

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