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
数据,但是如果您多次迭代某些属性,您可能希望在内存中连续排列它们。您可能还希望有多个视图,所有这些属性都是共享资源。。。同样,很难说。第一个方案在大多数情况下对初学者来说都是很好的设计。好的,谢谢你,大多数时候我只访问标志数组,所以第二个方案可能更好,我将按照你的建议进行一些分析。