Я изучаю 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 плиток. В результате мы должны взять 1000000^2 элементов Tile, так что нам нужен очень длинный непрерывный кусок памяти. Но невозможно получить такой большой кусок памяти (возможно ли это?).
Пожалуйста, объясните меня.
1,000,000^2 байта составляет приблизительно 931 * tera * байт. Никто не имеет такого типа памяти. – Neil
@Neil 1,000,000^2 байта "только" ~ 931GB. – LogicStuff
@LogicStuff К сожалению, вы правы. Тем не менее, немного высокий. – Neil