Игра на основе OpenTK заикается с перерывами - PullRequest
3 голосов
/ 24 декабря 2010

В настоящее время я разрабатываю игру с использованием OpenTK для рендеринга; C #, .Net 4.0, OpenGL 2.

Запуск в развернутом режиме (не во весь экран, но занимает все доступное пространство экрана) при разрешении 1280x1024, в среднем я вижу около 400 FPS. В разрешении 1680x1050 я вижу около 315 FPS в среднем. Несмотря на эту высокую частоту кадров, я испытываю периодическое заикание.

Как правило, в течение примерно 3 полных секунд рендеринг заметно замедляется, затем он становится идеально плавным в течение 0,5-1 секунды. Этот цикл повторяется навсегда.

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

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

Запуск приложения в сборке выпуска не помог решить проблему.

Я профилировал приложение, используя ANTS от redgate. Это указало на несколько хороших проблем, которые я с тех пор исправил.

Есть предложения?

1 Ответ

3 голосов
/ 25 декабря 2010

Этот тип заикания обычно вызывается сборщиком мусора.

Контролируйте количество ваших коллекций и проверяйте, соответствуют ли они периодам заикания (вызовите GC.CollectionCount () с 0, 1 и 2 в качестве параметров). Если это действительно причина, вам нужно будет профилировать и сокращать выделение памяти (здесь могут значительно помочь пулы объектов, а также структуры вместо кратковременных классов).

Как правило, во время обычного игрового процесса вам не нужны коллекции поколения 1 или 2.

Редактировать: отключить программный ограничитель кадров (т.е. вызвать Run () или Run (60), но не Run (60, 60)) и включить vsync. Это может помочь уменьшить заикание.

Кроме того, убедитесь, что оба монитора синхронизированы с одинаковой частотой. Даже незначительные различия приведут к заиканию при перетаскивании окна с основного на дополнительный монитор (я видел, что это происходит при разнице всего 60 Гц против 59,9 Гц).

...