我正在学习Cocos2dx,我使用的是贴图。因此,让我们考虑以下代码:
auto map = TMXTiledMap::create("map.tmx");
auto layer = map->getLayer("Tile Layer 1");
auto gid = layer->tileGIDAt(Point(X, Y));最后一句对我来说很重要。我很困惑,因为我看到了tileGIDAt(Point)的实现:
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元素,因此我们需要非常长的连续内存块。但是不可能得到这么大的内存块(有可能吗?)
请解释一下。
发布于 2015-08-20 09:52:49
不要一次把所有的地图都放进记忆里。不管怎么说,这位球员几乎不可能看到所有的一切。相反,只要有瓷砖的球员是上,加上一定数量的瓷砖四面八方的球员。
然后,当播放机移动时,从磁盘上的任何映射中加载新的瓷砖信息,或者,如果您执行过程块,则生成新的瓷砖,将内存中的瓷砖替换为加载/生成的新瓷砖。
发布于 2015-08-20 09:43:53
根据MSDN:
进程的虚拟地址空间是它可以使用的一组虚拟内存地址。每个进程的地址空间是私有的,除非是共享的,否则其他进程无法访问它。虚拟地址并不表示内存中对象的实际物理位置;相反,系统为每个进程维护一个页表,这是一个内部数据结构,用于将虚拟地址转换为相应的物理地址。每次线程引用一个地址时,系统都会将虚拟地址转换为物理地址。
因此,大型数组的分配没有问题,但仍然有进入hip memory fragmentation的机会。
https://stackoverflow.com/questions/32114394
复制相似问题