一个大物体或多个小物体
One big object or multiple small ones
我为一款Roguelike类型的游戏创建了一个地图系统,我问我,对于瓷砖来说,最好有一个存储物品、地形的大物体......或者我将它们分开在多个对象中。
一个例子更容易理解:
一个大类:
class Tile {
unsigned char flags;
Terrain *terrain;
std::vector<Item> items;
std::vector<Object> objects;
};
class Map {
Tile tiles[100][100];
};
或多个小的:
class Map {
unsigned char flags[100][100];
Terrain terrains[100][100];
std::vector<Item> items[100][100];
std::vector<Object> objects[100][100];
};
加载较小的对象在性能方面有什么优势吗?大多数时候,我不需要访问同一位置的所有列表。感谢您的帮助。
这完全取决于您的内存访问模式。如果您发现自己遍历所有flags
,然后是所有terrains
,然后是所有items
,然后是所有objects
比遍历单个磁贴的flags
、terrains
、items
和objects
更频繁......那么第二个布局可能比第一个布局具有更好的性能。
确定的唯一方法是剖析。
此外,您可以使用策略抽象内存布局,以便在测试/分析中轻松更改它:
template <typename Storage>
class Map
{
Storage _storage;
auto& getFlags(int x, int y);
auto& getTerrains(int x, int y);
auto& getItems(int x, int y);
auto& getObjects(int x, int y);
};
struct TileStorage { /* ... approach 1 ... */ };
struct JaggedStorage { /* ... approach 2 ... */ };
相关文章:
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 查找最小的下一个更大的元素
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 将一个小的 C 定义重写为"normal" C++函数
- 当只有一个线程主要使用该对象而其他线程很少使用它时,如何最小化该对象的互斥锁锁定?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- 需要帮助编写一个小程序来将循环乘以 n 个元素和 k 个多重性
- 我在c++中遇到了一个奇怪的错误,其中一个计算2个小整数加法的语句溢出到一个长值中
- 调用一个小函数两次(例如在if条件和主体中)比将结果存储在局部变量中更可取
- 在QT C++编辑Qtable模型数据时,我需要得到一个小盒子,我需要显示编辑文本,这怎么可能?
- 如何从另一个类编辑 QMainWindow UI 小部件?
- 在另一个小部件中更改QWidget的背景颜色
- 使用数组将最后一个最大值更改为第一个最小值
- 从大范围内生成一个随机数,但从大范围的中间开始生成较小的范围
- 一个大物体或多个小物体
- 我们能在虚空上放置一个小物体吗
- int、char、float和bool中最小的一个
- 如何最小化一个无框窗口,已设置大小固定的方法setFixedSize在Qt
- 如何调整地图以找到最近的较小物体