2015-08-20 52 views
0

我正在學習Cocos2dx,我正在使用平鋪的地圖。 所以,讓我們考慮下面這段代碼:一個非常大的數組(連續的內存塊)

auto map = TMXTiledMap::create("map.tmx"); 
auto layer = map->getLayer("Tile Layer 1"); 
auto gid = layer->tileGIDAt(Point(X, Y)); 

行和最後一行與我有關。我很困惑,因爲我看到了實現tileGIDAt(點):

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); 
} 

所以,我很困惑,因爲地圖上似乎被表示爲存儲陣列。

爲什麼可能?這對我很重要,因爲你知道瓷磚地圖可能非常大。關於尺寸的地圖是什麼:100萬瓦片×1000000瓦片。結果我們應該採用Tile的1000000^2個元素,所以我們需要一個非常長的連續的內存塊。但是獲得這麼大的內存是不可能的(有可能嗎?)。

請解釋一下。

+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

相關問題