C++ 一个大物体或多个小物体
我为一个类似流氓的游戏创建了一个地图系统,我问我,如果一个大的物体可以存储物品,地形,那么瓷砖的最佳选择是什么。。。或者我把它们分成多个对象 一个例子更容易理解: 一个大类:C++ 一个大物体或多个小物体,c++,arrays,c++11,C++,Arrays,C++11,我为一个类似流氓的游戏创建了一个地图系统,我问我,如果一个大的物体可以存储物品,地形,那么瓷砖的最佳选择是什么。。。或者我把它们分成多个对象 一个例子更容易理解: 一个大类: class Tile { unsigned char flags; Terrain *terrain; std::vector<Item> items; std::vector<Object> objects; }; class Map { Tile til
class Tile {
unsigned char flags;
Terrain *terrain;
std::vector<Item> items;
std::vector<Object> objects;
};
class Map {
Tile tiles[100][100];
};
类平铺{
无符号字符标志;
地形*地形;
向量项;
向量对象;
};
类图{
瓷砖[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];
};
类映射{
无符号字符标志[100][100];
地形地貌[100][100];
标准::向量项[100][100];
std::矢量对象[100][100];
};
加载较小的对象在性能方面有什么优势吗?
大多数时候,我不需要访问同一位置上的所有列表。
谢谢您的帮助。这完全取决于您的内存访问模式。如果您发现自己迭代所有
标志
,然后迭代所有地形
,然后迭代所有项目
,然后迭代所有对象
的频率比迭代单个磁贴的标志
,地形
,项目
,和对象
的频率更高。。。那么第二个布局可能比第一个布局具有更好的性能
唯一可以确定的方法是进行配置文件
此外,您可以使用策略抽象内存布局,以便在测试/评测中轻松更改它:
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 ... */ };
模板
类图
{
存储(u存储),;
自动和获取标志(整数x,整数y);
自动和getTerrains(intx,inty);
自动获取项目(&getItems)(整数x,整数y);
自动获取对象(&getObjects)(整数x,整数y);
};
结构TileStorage{/*…方法1…*/};
结构JaggedStorage{/*…方法2…*/};
就个人而言,我会使用第一个。我认为不研究使用模型就无法回答。当然,您希望有一个逻辑对象来收集Tile
数据,但是如果您多次迭代某些属性,您可能希望在内存中连续排列它们。您可能还希望有多个视图,所有这些属性都是共享资源。。。同样,很难说。第一个方案在大多数情况下对初学者来说都是很好的设计。好的,谢谢你,大多数时候我只访问标志数组,所以第二个方案可能更好,我将按照你的建议进行一些分析。