首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个非常大的数组(连续的内存块)

一个非常大的数组(连续的内存块)
EN

Stack Overflow用户
提问于 2015-08-20 09:23:36
回答 2查看 159关注 0票数 0

我正在学习Cocos2dx,我使用的是贴图。因此,让我们考虑以下代码:

代码语言:javascript
复制
 auto map = TMXTiledMap::create("map.tmx");
 auto layer = map->getLayer("Tile Layer 1");   
 auto gid = layer->tileGIDAt(Point(X, Y));

最后一句对我来说很重要。我很困惑,因为我看到了tileGIDAt(Point)的实现:

代码语言:javascript
复制
uint32_t TMXLayer::getTileGIDAt(const Vec2& pos, TMXTileFlags* flags/* = nullptr*/)
{
    CCASSERT(pos.x < _layerSize.width && pos.y < _layerSize.height && pos.x >=0 && pos.y >=0, "TMXLayer: invalid position");
    CCASSERT(_tiles && _atlasIndexArray, "TMXLayer: the tiles map has been released");

    ssize_t idx = static_cast<int>((pos.x + pos.y * _layerSize.width));
    // Bits on the far end of the 32-bit global tile ID are used for tile flags
    uint32_t tile = _tiles[idx];

    // issue1264, flipped tiles can be changed dynamically
    if (flags) 
    {
        *flags = (TMXTileFlags)(tile & kTMXFlipedAll);
    }

    return (tile & kTMXFlippedMask);
}

所以,我很困惑,因为在内存中,映射似乎被表示为数组。

为什么是可能的?这对我很重要,因为正如你所知,平铺的地图可能很大。那么大小图呢: 1000000块,1000000块。因此,我们应该使用Tile的1000000^2元素,因此我们需要非常长的连续内存块。但是不可能得到这么大的内存块(有可能吗?)

请解释一下。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-20 09:52:49

不要一次把所有的地图都放进记忆里。不管怎么说,这位球员几乎不可能看到所有的一切。相反,只要有瓷砖的球员是上,加上一定数量的瓷砖四面八方的球员。

然后,当播放机移动时,从磁盘上的任何映射中加载新的瓷砖信息,或者,如果您执行过程块,则生成新的瓷砖,将内存中的瓷砖替换为加载/生成的新瓷砖。

票数 2
EN

Stack Overflow用户

发布于 2015-08-20 09:43:53

根据MSDN:

进程的虚拟地址空间是它可以使用的一组虚拟内存地址。每个进程的地址空间是私有的,除非是共享的,否则其他进程无法访问它。虚拟地址并不表示内存中对象的实际物理位置;相反,系统为每个进程维护一个页表,这是一个内部数据结构,用于将虚拟地址转换为相应的物理地址。每次线程引用一个地址时,系统都会将虚拟地址转换为物理地址。

因此,大型数组的分配没有问题,但仍然有进入hip memory fragmentation的机会。

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

https://stackoverflow.com/questions/32114394

复制
相关文章

相似问题

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