大向量和内存保留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]

在上述向量中,第二维和第三维([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(),我可以看到我的内存使用情况在任务管理器中迅速上升,直到计算机最终崩溃。

有人可以给我一些处理超大向量的建议或技巧吗?我是否需要做一些压缩矢量的操作,以便单个索引描述相似图块的范围?我是否应该将地图存储在文件中而不是内存中,然后根据需要一次只读取其中的几块?

好的程序员如何处理这种情况?

sp871783024 回答:大向量和内存保留c ++

正如评论中已经提到的那样,您正在尝试仅为数据分配大量内存。

在这种情况下,您必须选择其他数据结构来存储它并对其进行操作。

以下是一些最简单的技巧,可用于操作数据的代码的复杂性:

  1. 您的默认值似乎毫无意义。为什么不只将设置为真值的数据存储在内存中?
  2. 您只能在内存中存储可见的数据部分(请参见Here's what's happening in Horizon: Zero Dawn every time you move a camera )。
  3. 您可能必须打包数据结构并进行对齐(请参见Data structure alignment)。

当然,在某些情况下,您必须限制需求,但这是生活的一部分。

本文链接:https://www.f2er.com/3068752.html

大家都在问