2015-08-20 3 views
0

Я изучаю 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, так что нам нужен очень длинный непрерывный кусок памяти. Но невозможно получить такой большой кусок памяти (возможно ли это?).

Пожалуйста, объясните меня.

+2

1,000,000^2 байта составляет приблизительно 931 * tera * байт. Никто не имеет такого типа памяти. – Neil

+1

@Neil 1,000,000^2 байта "только" ~ 931GB. – LogicStuff

+0

@LogicStuff К сожалению, вы правы. Тем не менее, немного высокий. – Neil

ответ

2

Не кладите все карты в память сразу. В любом случае, игрок вряд ли сможет все это увидеть. Вместо этого у вас есть только плейер, на котором игрок включен, плюс определенное количество плиток во всех направлениях вокруг игрока.

Затем, когда игрок перемещается, загружайте новую информацию о плитке с любой карты, имеющейся на диске, или создавайте, если выполняете процедурные плитки, заменяя плитки в памяти новым, который вы загружаете/генерируете.

1

В соответствии с MSDN:

виртуальное адресное пространство для процесса является набор адресов виртуальной памяти, которые он может использовать. Адресное пространство для каждого процесса является закрытым и недоступным для доступа к другим процессам, если оно не используется совместно. Виртуальный адрес не отражает фактическое физическое местоположение объекта в памяти; вместо этого система поддерживает таблицу страниц для каждого процесса, которая является внутренней структурой данных, используемой для преобразования виртуальных адресов в соответствующие им физические адреса. Каждый раз, когда поток ссылается на адрес, система переводит виртуальный адрес на физический адрес.

Таким образом, нет никаких проблем с выделением огромных массивов, но все еще есть шанс попасть в hip memory fragmentation

Смежные вопросы