2016-02-16 12 views
1

Я делаю игру на основе черепицы в SFML и решил реализовать простую рамку с уклоном, чтобы вырезать только плитки, которые находятся в окне просмотра камеры. Результат был успешным, так как это утроило мою частоту кадров! Однако был кеш. При запуске игры в отладке частота кадров вместо этого снижается за счет реализации усеченного усечения. Он от 90 до 30 кадров в секунду отлаживался, в то время как в выпуске он переходил от 100 до 350 кадров в секунду.Отверстие Frustum уменьшает частоту кадров в отладке, но улучшает его в выпуске

Отбраковка просто проверяет каждый прямоугольник плиток, независимо от того, пересекается ли он с прямоугольником окна просмотра. Если да, то рисуется. Игра предоставляет несколько видов для Splitscreen и код выглядит следующим образом:

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 кадров в секунду. Я очень смущен, почему это происходит.

+0

Возможно, это связано с оптимизацией компилятора? Скорее всего, ваш код не оптимизирован в режиме отладки - что хорошо, но в выпуске. Попробуйте временно включить оптимизацию в вашей сборке отладки, чтобы узнать, учитывает ли это разницу в fps. – Conduit

+0

Также: добро пожаловать в SO! Если у вас есть вопросы о том, как работает наше сообщество, есть вероятность, что у них есть ответ в [справочном центре] (http://stackoverflow.com/help) – Conduit

+0

Спасибо! Я немного новичок в C++ и visual studio. Как изменить оптимизацию компилятора? – LethalJam

ответ

1

Конспект длительной дискуссии в комментариях:

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

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

  • Нет связанных вопросов^_^