Есть несколько вещей, которые следует учитывать, чтобы определить, правильно ли используются потоки игрового процесса и запланированы ли они для достижения наилучшей производительности.
- Шаг кадров
- Многопоточность и распараллеливание потоков
- Соответствие ядра процессора
Многопоточность
Многие игры и игровые движки используют многопоточность для разделения работы ЦП на логические задачи, которые могут выполняться независимо. Одной из типичных конфигураций является игровой поток для ввода и игровой логики, поток рендеринга для подготовки и отправки объектов для рисования и рабочие потоки для других подзадач, таких как анимация или звук.
Мы рекомендуем распараллеливать потоки, чтобы воспользоваться преимуществами производительности многопоточности. Примером этого является сценарий, в котором потоки игры и рендеринга выполняются частично или полностью одновременно на разных ядрах. Это не всегда возможно, например, в случаях с общими зависимостями данных; однако, если это возможно, это может привести к снижению времени процессора и, следовательно, к потенциально более высокой частоте кадров.
![Игра с хорошо распараллеленными основным потоком и потоком рендеринга, а также рабочим потоком и аудиопотоком.](https://developer.android.com/static/images/agi/threads-scheduling-images/sample_multithreading.png?authuser=19&hl=ru)
Соответствие ядра процессора
Одним из факторов, который существенно влияет на производительность рабочих нагрузок вашего ЦП, является то, как они планируются на ядрах. Его можно разделить на две составляющие:
- Работают ли ваши игровые потоки на ядре, наиболее подходящем для их рабочей нагрузки.
- Часто ли ваши игровые потоки переключаются между ядрами.
Современные устройства часто используют архитектуру, называемую гетерогенными вычислениями , где ядра имеют разные уровни производительности:
- Одно или несколько ядер обеспечивают максимальную пиковую производительность, но потребляют больше энергии. Их иногда называют «большими» ядрами.
- Другие ядра имеют более низкую пиковую производительность, но более энергоэффективны. Их иногда называют «маленькими» ядрами.
- Опционально: одно или несколько ядер обеспечивают баланс между производительностью и мощностью. Их иногда называют «средними» ядрами.
Вы можете исследовать поведение потоков ЦП в разделе «Загрузка ЦП» , включив ЦП в конфигурации профиля при выполнении трассировки. Увеличив фрагмент трассировки <200 мс, вы можете просмотреть отдельные процессы, выполняемые в ядрах ЦП вашего устройства. Обычно ядра меньшего размера соответствуют меньшим индексам (например, процессоры «0»-»3»), тогда как ядра большего размера соответствуют более высоким индексам (например, процессоры «6-7»), а средние ядра, если они присутствуют, будут занимать индексы в между (например, процессоры «5»-«6»). Это общепринятое соглашение, но это не гарантия.
Если вы обнаружите, что определенные потоки планируются на процессорах, которые не соответствуют их потребностям в производительности или мощности, рассмотрите возможность вручную настроить привязку процессоров для этих потоков.
![Игра, в которой основной поток и поток рендеринга в основном работают на больших ядрах (ЦП 6–7), показаны голубым цветом.](https://developer.android.com/static/images/agi/threads-scheduling-images/sample_bigcores.png?authuser=19&hl=ru)
Вы также можете наблюдать, переключаются ли ваши потоки между ядрами. Такие переключатели ядра влекут за собой некоторые накладные расходы из-за переключения контекста и потери состояния кэша/регистров ядра.
![Игра с основным потоком (Thread-7) и потоком рендеринга (Thread-8), которые переключаются между ядрами, показаны фиолетовым цветом.](https://developer.android.com/static/images/agi/threads-scheduling-images/sample_coreswitching.png?authuser=19&hl=ru)
Установка привязки ЦП для потока дает системе указание запланировать его на данном ядре, когда ваша игра находится на переднем плане. При этом следует учитывать несколько факторов:
- Программное обеспечение платформы не может динамически регулировать размещение задач с учетом таких факторов времени выполнения, как нагрузка и температурное регулирование.
Тестирование производительности на разных устройствах может дать очень разные характеристики производительности, особенно если устройства значительно различаются по цене или дате выпуска.
Более новое или более дорогое устройство может с комфортом выполнять заданную рабочую нагрузку на небольшом ядре, но более старому или более доступному устройству может потребоваться ядро большего размера, чтобы уложиться в сроки для той же рабочей нагрузки.
Принудительно привязываясь к большим ядрам, вы можете неоправданно увеличить расход заряда батареи и тепловую нагрузку.
По этим причинам, как правило, лучше избегать ручной настройки привязки ЦП.