Возможные причины циклических падений FPS?

Я писал новую базу кода в opengl и очень рано встретил странную ошибку. Это явное колебание частоты кадров, которая повторяется и предсказуема.

Я знаю, что он определенно пропорционален отображаемым объектам. Он также пропорционален размеру экрана (не размер видового экрана, а не размер окна, просто размер физического устройства) Это примерно соотношение кадров 0.2: 1 (низкий: высокий)

Мне стало любопытно и графовали его, имейте в виду, что окно/контекст не отменен или не ограничен. Object count and screen size comparisons

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

Я не понимаю, если это в основном один кадр, который визуализируется снова и снова, что может вызвать такие большие изменения?

Здесь псевдокод программы

create window
load shaders
grab uniform locations
create camera
create 3 meshes // They just hold the buffers and data for a model
create x objects and pass a pointer to a random mesh // Objects hold position, rotation etc + link to mesh
while game is running
    poll window for events
    capture mouse and recalculate VP matrix if required
    for each object
        recalc MVP
        bind mesh buffers and draw elements
    draw window //SFML handles this, just swaps front/back buffers and draws
clean up data

Если это не дает понимания, я загрузил проект VS2012 в github: https://github.com/Twistedsnail/Untitled_for_SO (он, вероятно, не будет запускаться локально, потому что он требует SFML2 в указанном месте и GLM в файлах VS)

Ответ 1

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

Причины, о которых я помню:

  • Коллекция мусора Lua. Где использовал Lua в качестве языка сценариев для движка, и GC создавал бы впечатление, будто возникла проблема с рендерингом! Хотя это было не очевидно. Проверьте любые другие потоки или даже процессы, которые могут стать жадными в вашем приложении/машине.

  • Проблемы с драйвером OpenGL: отключение или включение "Threaded Optimization" в драйвере NVIDIA иногда вызывало смешные эффекты на производительность. У драйверов ATI чаще всего были ошибки, требующие обновления.

  • Проблемы с циклом событий Windows. Как и использование GetMessage вместо PeekMessage.

Другое дело: если вы действительно не много рендеринга и имеете несколько тысяч FPS: даже малейшее увеличение времени рендеринга окажет "огромное" влияние на ваш FPS. Таким образом, то, что вы видите, может быть очень нормальной операцией операционной системы/драйвера, которая не имеет значения при работе с "нормальной" игрой FPS, например, с 60 до 120 и не намного заметной позже.