首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大矢量与内存守恒c++

大矢量与内存守恒c++
EN

Stack Overflow用户
提问于 2019-11-20 04:39:08
回答 1查看 190关注 0票数 1

我正在用C++制作一个贴图编辑器。现在,在编辑地图时,它的属性存储在三个向量中:

代码语言:javascript
复制
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维(map x和map y)指的是地图上的实际平铺坐标。这些只是普通的正方形2d地图。最后一个向量的类型是以下结构:

代码语言:javascript
复制
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(),并且我可以在任务管理器中快速地观察内存的使用情况,直到我的计算机最终崩溃。

有人能给我一些关于处理大向量的建议或建议吗?我要做一些像压缩向量这样的事情吗,这样一个索引就可以描述一系列相似的瓷砖了吗?我是否应该将地图存储在一个文件中而不是内存中,然后根据需要一次只读几块呢?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-20 08:38:50

正如注释中已经提到的,您正在尝试只为数据分配大量内存。

在这种情况下,您必须选择不同的数据结构来存储和操作它。

下面是几个最简单的技巧,您可以在操作数据的代码的复杂性方面应用这些技巧:

  1. 您的默认值似乎毫无意义。为什么不将设置为真值的数据只存储在内存中?
  2. 您可以将数据的可见部分存储在内存中(请参见这里是地平线上发生的事情:每次你移动相机的时候都是零黎明)。
  3. 您可能必须打包数据结构并处理对齐问题(请参阅数据结构对齐)。

当然,有一种情况是,你必须限制需求,但这是生活的一部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58946800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档