我正在用C ++制作瓦片地图编辑器。现在,在编辑地图时,其属性存储在三个向量中:
vector<vector<vector<bool>>> CanvasCollisionObstruction; //[collision,obstruction][map x][map y]
vector<vector<vector<bool>>> CanvasZoneOverlays; //zone overlays for programmable map zones [zone type][map x][map y]
vector<vector<vector<canvasClip>>> CanvasClips; //identifies which sprite occupies this tile [layer number][map x][map y]
在上述向量中,第二维和第三维([map x]和[map y])是指地图上实际的图块坐标。这些只是普通的旧正方形2d地图。最后一个向量的类型为以下结构:
struct canvasClip
{
int tileset;
int clip;
//initialization to check if it's in-use
canvasClip() : tileset(-1),clip(-1) {}
bool isInitialized()
{//a clip is only rendered if it is initialized
return ((tileset >= 0) && (clip >= 0));
}
bool operator==(const canvasClip& a) const
{//used in flood-fill to compare with target tile
return ((tileset == a.tileset) && (clip == a.clip));
}
bool operator!=(const canvasClip& a) const
{//used in flood-fill to compare with target tile
return ((tileset != a.tileset) || (clip != a.clip));
}
};
对于此应用程序,我希望最终希望生成不定(但可能永远不超过10个)层的大小超过50000x50000瓦片的地图。总共大约有12个区域,并且这个数目是恒定的。
地图编辑器具有一些用于更改地图大小的控件(数字输入和按钮)。当我将地图大小设置为一个非常大的数字时,我在每个向量上调用了vector.resize(),我可以看到我的内存使用情况在任务管理器中迅速上升,直到计算机最终崩溃。
有人可以给我一些处理超大向量的建议或技巧吗?我是否需要做一些压缩矢量的操作,以便单个索引描述相似图块的范围?我是否应该将地图存储在文件中而不是内存中,然后根据需要一次只读取其中的几块?
好的程序员如何处理这种情况?