Одна из самых сложных задач для разработчиков приложений — создание плавной анимации без сбоев. Отладка может быть особенно трудной, когда система одновременно выполняет ресурсоемкие фоновые задачи. Трудно определить, вызван ли сбой вашим приложением или системой. Однако инструмент профилирования может помочь выявить возможный источник некорректного поведения.
Рендеринг в ChromeOS
В хорошо оптимизированных приложениях, таких как игры, обычно используется двойная буферизация, чтобы свести время отклика пользователя к минимуму. Тем не менее, многие факторы могут ухудшить производительность. Например, если отрисовка кадра занимает слишком много времени, отрисованный результат не будет готов к следующей смене буфера, и предыдущий кадр повторится.
В этом случае рендерер не может начать отрисовку следующего кадра, что вызывает ещё больше проблем. Этот сценарий знаком разработчикам мобильных приложений для Android. Когда приложение работает на ChromeOS, ситуация становится ещё сложнее.
Приложение, работающее на рабочем столе, не отображает изображение непосредственно на экране. Вместо этого оно отображает свои данные в текстуру. Обычно существует несколько приложений, каждое из которых отображает свою графику в текстуру. Система формирует изображение на экране с помощью композитора, который объединяет все текстуры в единое изображение рабочего стола.
Композитор работает незаметно в фоновом режиме, но вносит задержку в один кадр, чтобы максимально эффективно использовать конвейер обработки изображений на графическом процессоре. Эта задержка сглаживает колебания производительности системы и помогает сбалансировать асимметричную нагрузку.
Когда операционная система работает с высокой нагрузкой, графический процессор может быть перегружен, что приводит к задержке между рендерингом кадра и его появлением на экране. В зависимости от оборудования система может использовать четырехкратную буферизацию для компенсации. Даже при более глубокой буферизации графический конвейер все равно может давать сбои.
Графический трассировщик ARC
В ChromeOS есть инструмент профилирования, который показывает, как буферы распределяются по системе, когда происходят операции подкачки памяти, насколько загружены ЦП/ГП и что делает ваше приложение в данный момент времени (см. изображение ниже):
Настройте профилировщик.
Для использования профилировщика необходимо установить M75 или более позднюю версию. Для достижения наилучших результатов используйте устройство на базе процессора Intel.
Перед использованием профилировщика заполните ваше приложение трассировками. Добавьте в код строку Trace.traceCounter(Trace.TRACE_TAG_GRAPHICS, "Event", <number>); в том месте, где вы хотите включить трассировку. Используйте Event , начинающееся с префикса customTrace . Префикс не отображается в сообщении трассировки.
Для настройки профилировщика выполните следующие действия:
- Включите режим разработчика.
- Включите настройки Chrome и активируйте инструмент визуализации графических буферов ARC .
- Перейдите по адресу
chrome://arc-graphics-tracing.
Запустите профилировщик.
- Выберите «Остановить при сбое» .
- Запустите приложение для Android.
- Когда приложение Android активно и находится в фокусе, нажмите
Control+Shift+G
При возникновении сбоя открывается окно браузера. Используйте клавиши W и S для масштабирования и уменьшения временной шкалы.