2016-02-16 52 views
1

我在SFML中製作基於拼圖的遊戲,並決定實施一個簡單的包圍盒截錐體剔除,以僅繪製相機視口中的貼圖。結果取得了成功,因爲它將我的幀率提高了兩倍!但是,有一個緩存。當在調試中運行遊戲時,幀率將由實施的平截頭體剔除降低。它在調試中從90 fps下降到30 fps,而在發佈時它從100上升到了大約350 fps。遏抑剔除在調試中降低了幀率,但在發佈中提高了它

剔除只是檢查每個瓷磚矩形,無論它是否與視口的矩形相交。如果確實如此,則繪製。本場比賽呈現多個視圖的分屏和代碼如下所示:

for (unsigned int i = 0; i < views.size(); i++) 
    { 

....

// Calculate viewport rectangle. 
     IntRect viewRect; 
     viewRect.width = views[i]->getSize().x; 
     viewRect.height = views[i]->getSize().y; 
     viewRect.left = views[i]->getCenter().x - views[i]->getSize().x/2; 
     viewRect.top = views[i]->getCenter().y - views[i]->getSize().y/2; 

     // Loop throug level tiles and render them. 
     for (unsigned int j = 0; j < tileLayers.size(); j++) 
     { 
      for (unsigned int k = 0; k < tileLayers[j].size(); k++) 
      { 
       if (tileLayers[j][k]->collide(viewRect)) 
        tileLayers[j][k]->drawSprite(window); 
      } 
     } 

....

bool StaticGameObject::collide(IntRect rectangle) 
{ 
    // Private member variable collisionRect. 
    // Width and height is set in constructor. 
    collisionRect.left = getPosition().x; 
    collisionRect.top = getPosition().y; 

    if (collisionRect.intersects(rectangle)) 
    { 
     return true; 
    } 
    return false; 
} 

當我刪除了相交呼籲矩形,幀速率回到90 fps。我很困惑,爲什麼會發生這種情況。

+0

也許這與編譯器優化有關?機會是你的代碼沒有在調試模式下優化 - 這是好的 - 但在發佈。嘗試暫時打開調試版本中的優化,看看是否考慮到了fps差異。 – Conduit

+0

另外:歡迎來到SO!如果您對我們社區的運作方式有任何疑問,可以在[幫助中心](http://stackoverflow.com/help) – Conduit

+0

謝謝!我對C++和visual studio有點新鮮。你如何改變編譯器優化? – LethalJam

回答

1

在評論中冗長的討論的摘要:

使用域剔除算法導致顯著的開銷,其中有在調試版本降低了整體幀率的效果。在發佈版本中,編譯器優化了額外的開銷,導致幀率增加。不幸的是,這是一個必要的罪惡,因爲優化的代碼使調試變得不可能。