大向量和内存保护 C++
Large vectors and memory conservation c++
我正在用 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]
在上述向量中,第 2 和第 3 维([地图 x] 和 [地图 y])指的是地图上的实际图块坐标。这些只是普通的旧方形二维地图。最后一个向量的类型是以下结构:
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));
}
};
对于这个应用程序,我希望最终生成大小超过 50000x50000 个图块的地图,跨越不确定的(但可能不超过 10 个)图层。总共大约有12个区域,这个数字是恒定的。
地图编辑器有一些控件可以改变地图的大小(数字输入和按钮)。当我将地图大小设置为非常大的数字时,我在每个向量上调用 vector.resize(),我可以在任务管理器中看到我的内存使用量快速上升,直到我的计算机最终崩溃。
谁能给我一些处理超大向量的建议或技巧?我是否必须做一些类似压缩矢量的事情,以便单个索引描述相似图块的跨度?我应该将地图存储在文件中而不是内存中,然后根据需要一次只读回其中的几个块吗?
优秀的程序员如何处理这种情况?
正如评论中已经提到的,您正试图为数据分配大量内存。
在这种情况下,您必须选择不同的数据结构来存储和操作它。
以下是一些最简单的技巧,您可以应用这些技巧来降低操作数据的代码的复杂性:
- 您的默认值似乎毫无意义。为什么不只将设置为真值的数据存储在内存中?
- 您可以仅在内存中存储数据的可见部分(请参阅 这是 Horizon 中发生的情况:每次移动相机时,零黎明
).
- 您可能需要打包数据结构并处理对齐(参见 Data structure alignment)。
当然,也有限制要求的情况,但那是生活的一部分。
我正在用 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]
在上述向量中,第 2 和第 3 维([地图 x] 和 [地图 y])指的是地图上的实际图块坐标。这些只是普通的旧方形二维地图。最后一个向量的类型是以下结构:
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));
}
};
对于这个应用程序,我希望最终生成大小超过 50000x50000 个图块的地图,跨越不确定的(但可能不超过 10 个)图层。总共大约有12个区域,这个数字是恒定的。
地图编辑器有一些控件可以改变地图的大小(数字输入和按钮)。当我将地图大小设置为非常大的数字时,我在每个向量上调用 vector.resize(),我可以在任务管理器中看到我的内存使用量快速上升,直到我的计算机最终崩溃。
谁能给我一些处理超大向量的建议或技巧?我是否必须做一些类似压缩矢量的事情,以便单个索引描述相似图块的跨度?我应该将地图存储在文件中而不是内存中,然后根据需要一次只读回其中的几个块吗?
优秀的程序员如何处理这种情况?
正如评论中已经提到的,您正试图为数据分配大量内存。
在这种情况下,您必须选择不同的数据结构来存储和操作它。
以下是一些最简单的技巧,您可以应用这些技巧来降低操作数据的代码的复杂性:
- 您的默认值似乎毫无意义。为什么不只将设置为真值的数据存储在内存中?
- 您可以仅在内存中存储数据的可见部分(请参阅 这是 Horizon 中发生的情况:每次移动相机时,零黎明 ).
- 您可能需要打包数据结构并处理对齐(参见 Data structure alignment)。
当然,也有限制要求的情况,但那是生活的一部分。