我为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];
};
加载较小的物体在性能方面是否有任何优势? 大多数时候我不需要访问同一个地方的所有列表。 谢谢你的帮助。
答案 0 :(得分:1)
这完全取决于您的内存访问模式。如果您发现自己遍历所有flags
,那么所有terrains
,然后是所有items
,那么所有objects
更频繁而不是迭代单个flags
tile 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 ... */ };
...然后第二个布局可能比第一个布局具有更好的性能。
唯一可以确定的方法是剖析。
此外,您可以使用策略抽象内存布局,以便在测试/分析中轻松更改它:
ParentFolderId