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的函数,根据需要进行节点的拆分和合并。
我正在构建一个体素引擎,所以我担心内存使用,使用 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的函数,根据需要进行节点的拆分和合并。