C ++ 12位变量,我该怎么做?
c++ 12bit variable, how can I do this?
我正在构建一个体素引擎,所以我担心内存使用,使用 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,根据需要对节点进行拆分和合并。
相关文章:
- 我该怎么做才能摆脱使用命名空间时的语法错误?
- 模板类是这里的最佳选择吗?如果是,我该怎么做?
- 在C++中,创建'n'数量的对象的推荐方法是什么,其中n是用户定义的。我该怎么做?
- 我必须输入我的名字才能输入我的资源,我该怎么做
- swig-包装到c#时,没有默认的std ::列表,我该怎么做
- C ++ 12位变量,我该怎么做?
- 在使用 emscripten 编译时,我该怎么做才能包含 <X11/Xlocale.h>?
- 我该怎么做 - 就像一个速度 的功率快速的功率一样快速的两个功率
- 错误:不允许指向不完整类类型的指针.我该怎么做
- 我该怎么做 throw 来处理 C++ 中的错误数据类型
- 正在尝试初始化区域结构内的边缘结构.我该怎么做
- 我想在我的main中为下面的代码创建一个对象..那么我该怎么做呢
- 我该怎么做才能不使用!openFile.eof()
- 这是对reinterpret_cast的合法使用吗?如果不是,我该怎么做
- 我把矢量从一个文本文件中归档,它不会变成一行.我该怎么做
- 我该怎么做才能在 eclipse 中设置C++开发
- C ++ win 32,我想将项目列表添加到组合框中.我该怎么做
- 我有一个类来表示整数,我想区分磅和公斤,我该怎么做
- 如果我只想在模板中专门研究一种方法,我该怎么做
- 我正试着计算月、日和年.我该怎么做呢?