Анализ планирования потоков

Есть несколько вещей, которые следует учитывать, чтобы определить, правильно ли используются потоки игрового процесса и запланированы ли они для достижения наилучшей производительности.

  • Шаг кадров
  • Многопоточность и распараллеливание потоков
  • Соответствие ядра процессора

Многопоточность

Многие игры и игровые движки используют многопоточность для разделения работы ЦП на логические задачи, которые могут выполняться независимо. Одной из типичных конфигураций является игровой поток для ввода и игровой логики, поток рендеринга для подготовки и отправки объектов для рисования и рабочие потоки для других подзадач, таких как анимация или звук.

Мы рекомендуем распараллеливать потоки, чтобы воспользоваться преимуществами производительности многопоточности. Примером этого является сценарий, в котором потоки игры и рендеринга выполняются частично или полностью одновременно на разных ядрах. Это не всегда возможно, например, в случаях с общими зависимостями данных; однако, если это возможно, это может привести к снижению времени процессора и, следовательно, к потенциально более высокой частоте кадров.

Игра с хорошо распараллеленными основным потоком и потоком рендеринга, а также рабочим потоком и аудиопотоком.
Рисунок 1. Игра с хорошо распараллеленными основным потоком и потоком рендеринга, а также рабочим потоком и аудиопотоком.

Соответствие ядра процессора

Одним из факторов, который существенно влияет на производительность рабочих нагрузок вашего ЦП, является то, как они планируются на ядрах. Его можно разделить на две составляющие:

  • Работают ли ваши игровые потоки на ядре, наиболее подходящем для их рабочей нагрузки.
  • Часто ли ваши игровые потоки переключаются между ядрами.

Современные устройства часто используют архитектуру, называемую гетерогенными вычислениями , где ядра имеют разные уровни производительности:

  • Одно или несколько ядер обеспечивают максимальную пиковую производительность, но потребляют больше энергии. Их иногда называют «большими» ядрами.
  • Другие ядра имеют более низкую пиковую производительность, но более энергоэффективны. Их иногда называют «маленькими» ядрами.
  • Опционально: одно или несколько ядер обеспечивают баланс между производительностью и мощностью. Их иногда называют «средними» ядрами.

Вы можете исследовать поведение потоков ЦП в разделе «Загрузка ЦП» , включив ЦП в конфигурации профиля при выполнении трассировки. Увеличив фрагмент трассировки <200 мс, вы можете просмотреть отдельные процессы, выполняемые в ядрах ЦП вашего устройства. Обычно ядра меньшего размера соответствуют меньшим индексам (например, процессоры «0»-»3»), тогда как ядра большего размера соответствуют более высоким индексам (например, процессоры «6-7»), а средние ядра, если они присутствуют, будут занимать индексы в между (например, процессоры «5»-«6»). Это общепринятое соглашение, но это не гарантия.

Если вы обнаружите, что определенные потоки планируются на процессорах, которые не соответствуют их потребностям в производительности или мощности, рассмотрите возможность вручную настроить привязку процессоров для этих потоков.

Игра, в которой основной поток и поток рендеринга в основном работают на больших ядрах (ЦП 6–7), показаны голубым цветом.
Рис. 2. Игра, в которой основной поток и поток рендеринга в основном работают на больших ядрах (ЦП 6–7), показаны голубым цветом.

Вы также можете наблюдать, переключаются ли ваши потоки между ядрами. Такие переключатели ядра влекут за собой некоторые накладные расходы из-за переключения контекста и потери состояния кэша/регистров ядра.

Игра с основным потоком (Thread-7) и потоком рендеринга (Thread-8), которые переключаются между ядрами, показаны фиолетовым цветом.
Рис. 3. Игра с основным (Thread-7) и потоком рендеринга (Thread-8), которые переключаются между ядрами, показаны фиолетовым цветом.

Установка привязки ЦП для потока дает системе указание запланировать его на данном ядре, когда ваша игра находится на переднем плане. При этом следует учитывать несколько факторов:

  • Программное обеспечение платформы не может динамически регулировать размещение задач с учетом таких факторов времени выполнения, как нагрузка и температурное регулирование.
  • Тестирование производительности на разных устройствах может дать очень разные характеристики производительности, особенно если устройства значительно различаются по цене или дате выпуска.

    Более новое или более дорогое устройство может с комфортом выполнять заданную рабочую нагрузку на небольшом ядре, но более старому или более доступному устройству может потребоваться ядро ​​большего размера, чтобы уложиться в сроки для той же рабочей нагрузки.

  • Принудительно привязываясь к большим ядрам, вы можете неоправданно увеличить расход заряда батареи и тепловую нагрузку.

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