«

»

Фев 27 2014

Потоки в Windows и Linux для игр

Т.к. 3D-игра является приложением мягкого реального времени, то требует соответственного отношения к себе со стороны ОС. Конечно ни Windows, ни Linux (без специальных патчей) не являются ОС реального времени в полном понимании этого слова. В то же время основным врагом плавного FPS являются отнюдь не обработчики аппаратных прерываний (в Windows, по моим замерам, на неё тратится 1-2% времени с редкими пиками до 5%, аналогичная ситуация с DPC, только пики до 15% и могут быть до 5 сек). Основные проблемы доставляют другие приложения, запущенные параллельно нашему. Ведь даже если внешне в системе запущенна только наша игра, то на самом деле в системе болтается целая куча пользовательских процессов. И не все из них постоянно спят, некоторые просыпаются и начинают что-то делать.

Проблема заключается в том, что в Windows квант времени выделяемого потоку колеблется от 32 до 100 мс (в Linux – от 10 до 120мс). Т.е. в худшем случае, при 30 кадрах в секунду, мы можем потерять управление на целых 3 кадра, причём в совершенно непредсказуемое время. Лаг в 100мс не является проблемой для большинства обычных программ, но для приложений мягкого реального времени он уже губителен. А если ещё вспомнить такие фокусы Windows, как динамическое изменение приоритетов потоков по целому ряду причин, то становится совсем грустно.

Однако решение есть и оно довольно простое. Обе ОС поддерживают для процессов/потоков “группу приоритетов реального времени”. Хоть они так и называются, но по факту являются кое чем иным:

  • Потоки с приоритетами реального времени исполняются вытесняя любые потоки с прочими приоритетами и не отдают им управления до тех пор пока не завершатся или уснут
  • Поток с большим приоритетом немедленно вытесняет поток с меньшим приоритетом (проверка проводится с интервалом в 1мс)
  • Квант времени для таких потоков в Widows составляет 32мс, в Linux 120мс.
  • В Windows для процессов класса REALTIME_PRIORITY_CLASS не применяется никаких динамических приоритетов, а динамические приоритеты обычных потоков никогда не превышают 15-ти (потоки процесса REALTIME_PRIORITY_CLASS имеют приоритеты 16-31)
  • В Linux доступен режим, в котором к таким потокам не применяется вытесняющая многозадачность
  • Точность функции sleep находится на уровне 1 мс

 

Добавить комментарий