Падение производительности анимации Android, когда устройство остается неподвижным, но к нему прикасаются

Мое приложение изменяет свойства некоторых очень простых представлений (поворот, перевод) для каждого кадра. Я использовал systrace, как рекомендуется в статьях о производительности Android, чтобы проверить, не пропускаю ли я кадры.

Вышло что-то действительно неожиданное. Когда устройство стояло на месте (даже если я касался экрана), загрузка ЦП была выше, появлялись предупреждения на системной трассе, а красная часть профилировщика рендеринга графического процессора была длиннее. Когда я очень быстро вращал или встряхивал устройство, все было в порядке.

Ниже приведены ссылки на результаты. Shake — когда я очень быстро вращал устройства, no_shake — когда они оставались лежать на моем столе.

Я сделал очень простое тестовое приложение, в котором используется одна анимация перевода: исходный код.

Системная трасса: без встряхивания, трясти

Загрузка ЦП: введите здесь описание изображения

Профилировщик GPU: введите здесь описание изображения

Глядя на системную трассировку встряхивания, где частота кадров плавная, почему в строках HW_VSYNC_0 и HW_VSYNC_ON_0 нет данных? Как я могу прочитать частоту процессора (я включил опцию при захвате трассировки).

Что касается проблемы, моя теория заключалась в том, что устройство может снижать частоту процессора. Как я могу прочитать это в systrace? Я использовал стороннее приложение, чтобы проверить эту гипотезу, и это верно, как показано ниже. Итак, что я могу сделать, чтобы избежать этой проблемы?

введите здесь описание изображения

Почему устройство делает это? Сначала я подумал, что устройство использует данные акселерометра, чтобы понять, не используется ли оно, а затем снизило частоту процессора. Но, чтобы увеличить частоту процессора, мне приходится очень сильно встряхивать устройство. Удержание его, как у обычного человека, не увеличивает частоту процессора.

Я знаю, что возникает много вопросов, но, прочитав все связанные статьи о графическом конвейере Android, у меня закончились идеи.

Проблема возникла на Sony Xperia Z3 под управлением Android 5.1. Проблема не воспроизводилась на Nexus 5 под управлением Android 6.

Обновить

Похоже, проблема с производительностью вызвана троттлингом CPU/GPU. То же устройство, Xperia Z3, под управлением Android 4.4, хотя и снижает тактовую частоту, согласно Systrace работает лучше. Также он не увеличивает скорость при тряске.

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


person Petrakeas    schedule 05.11.2015    source источник
comment
Snapdragon 810 ужасно хреновый. .. вот почему :)   -  person Selvin    schedule 05.11.2015
comment
В Nexus 5 Snapdragon 800 этой проблемы нет. Я не знаю, связана ли эта проблема с версией Android, OEM или чем-то еще.   -  person Petrakeas    schedule 05.11.2015
comment
возможно, это исправлено сейчас (в ядре 6 или новее) ... я все еще делаю ставку на переключение между большими и маленькими ядрами в Snapdragon   -  person Selvin    schedule 05.11.2015
comment
Что вы имеете в виду под «большими» и «маленькими» ядрами? Даже если я признаю, что это делается для уменьшения потребления энергии, почему они запускают это таким образом? Это не имеет никакого смысла!   -  person Petrakeas    schedule 05.11.2015
comment
snapdragon 810 имеет четырехъядерный процессор ARM® Cortex™ A57 с тактовой частотой до 2 ГГц и четырехъядерный процессор A53... некоторые ядра (насколько я знаю, то же, что и Z3) имели проблемы с запуском между ними ( Вы читали ссылку, которую я дал в первом комментарии?)   -  person Selvin    schedule 05.11.2015
comment
Извини. Просто прочитайте это. Однако в Z3 используется Snapdragon 801, а не 810. Но даже если это так, то почему они решают снизить ядра или сбросить частоту таким образом?   -  person Petrakeas    schedule 05.11.2015
comment
Это объяснение задержки касания в Project Butter на Google I/O 2012 может быть полезным: youtube.com/   -  person Dick Lucas    schedule 17.05.2017


Ответы (2)


Некоторые наблюдения...

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

Глядя на вывод systrace, только на строки «CPU n», вы можете видеть, что трассировка «дрожания» поддерживает работу всех четырех ядер, в то время как трассировка «без дрожания» часто справляется с 2 или 3. Таким образом, нагрузка на системе светлее, когда ее не качаешь. В зависимости от того, как настроен регулятор ЦП, он может вносить и другие изменения, например, в тактовые частоты.

Вы можете увидеть изменения значений различных часов, добавив тег «freq» в командную строку systrace. Вам может понадобиться рутированное устройство, чтобы получить эту информацию. Он должен показать изменения в настройках тактовой частоты процессора, пропускной способности графического процессора и других загадочных элементов. Обратите внимание, что он сообщает только об изменениях, поэтому вы можете нажать на экран после начала записи, чтобы побудить его что-то сделать.

Я уверен, что вы знаете это, но для тех, кто не знает: если что-то требует N циклов ЦП для выполнения, а ЦП работает на 100% скорости, задача будет завершена за T секунд. Если ЦП работает на скорости 50%, задача будет завершена за 2*T секунд. Инструменты, которые измеряют загрузку ЦП, делают это, определяя, какой процент времени ЦП работает по сравнению с временем простоя за заданный период. Если инструмент наблюдает в течение 1 секунды и задача выполняется в течение 1 секунды, это 100%-ное использование. Если тактовые частоты процессора выше, а задача завершается за 0,5 секунды, это означает использование 50%. Преимущество более низких тактовых частот заключается в том, что энергопотребление нелинейно, поэтому, хотя вы используете N циклов ЦП в любом случае, более низкая и медленная конфигурация меньше разряжает батарею. Проблема с более низкими тактовыми частотами заключается в том, что для выполнения требуется больше времени, и ваше приложение может в конечном итоге пропускать кадры. Вот почему прикосновение к экрану увеличивает часы: регулятор ЦП знает, что вы взаимодействуете с устройством, и настраивает систему так, чтобы взаимодействие было максимально плавным.

Вы должны игнорировать материал VSYNC. На некоторых устройствах SurfaceFlinger использует несовпадающие по фазе сигналы VSYNC, генерируемые программным обеспечением (подробности см. в Google «dispsync»). Он использует обратную связь от барьера обновления дисплея, чтобы определить, не дрейфует ли он, и на короткое время снова включает аппаратную VSYNC для повторной синхронизации, когда это необходимо. (FWIW, строки, о которых идет речь, делают, содержат данные в опубликованных вами трассировках.)

person fadden    schedule 05.11.2015
comment
Спасибо за объяснение. Я обновил вопрос о причине увеличения процессора при встряхивании устройства. Что касается частоты Systrace и ЦП, тег freq был включен в ADB, когда я захватил трассировки, и некоторые данные отображаются, но когда я нажимаю на них, значение не отображается. Это потому, что устройство не рутировано? - person Petrakeas; 09.11.2015
comment
Также я заметил на трассировке, что когда аппаратный VSYNC в ON, то VSYNC_app происходит одновременно с HW_VSYNC_0 с нулевым смещением. Это значит, что у меня лаг на 2 полных кадра. Если бы у меня была задержка в 1,5 кадра (как вы объяснили здесь), должно произойти VSYNC_app немного позже HW_VSYNC_0. Я правильно это понял? - person Petrakeas; 09.11.2015
comment
Не все устройства настраивают смещение dispsync для приложения. Вам необходимо проверить конфигурацию платы для рассматриваемого устройства. Я ожидаю увидеть смещение событий приложения и SF от VSYNC на Nexus 5, но, вероятно, не на Sony. Строки ЦП в вашей трассировке показывают большую активность на встряхиваемом устройстве; вам придется копаться, чтобы понять, что это за дело. Если вы не видите данные в строках freq, то либо ничего не меняется на протяжении трассировки (маловероятно), либо они просто не проходят, когда не запускаются от имени root. - person fadden; 09.11.2015
comment
Ведь в Nexus 5 есть смещение. Выгруженные трассы имеют сегменты данных в строке частоты. Однако, когда я их выбираю, информация не отображается. Должна ли была отображаться частота в Гц? Приблизив строки ЦП, я не заметил большей активности на встряхиваемом устройстве. Просто более короткая продолжительность и использование всех ядер. Сегменты на самом деле более разрежены по сравнению с невстряхиваемыми. - person Petrakeas; 10.11.2015
comment
Следы, связанные с вопросом, не содержат информации о частоте. Вы должны получить около 10 новых строк со всем, от частоты ядра процессора до пропускной способности графического процессора, до вещей, которые я не совсем уверен, что это такое. Если это не те трассы с включенной частотой, опубликуйте те, которые есть. В загруженных трассировках встряхивание использует 4 ядра, а ни одно встряхивание не использует 2 или 3, что говорит о том, что встряхивание заставляет устройство работать интенсивнее. Если процесс явно не запрашивает сходство с потоком, регулятор мощности будет пытаться использовать как можно меньше потоков. - person fadden; 10.11.2015
comment
Связанные трассировки содержат только строку cpufreq с некоторыми данными, которые я не могу прочитать. Согласно Android Device Monitor, загрузка ЦП распределяется между одними и теми же процессами. Однако в устройстве для встряхивания процент простоя больше. Моя теория (как написано в обновленном вопросе) заключается в том, что устройство заставляет работать усерднее, чтобы быстрее выполнять возможное изменение ориентации, даже если это на самом деле не происходит. Я измерил увеличение частоты, даже когда не было запущено никаких пользовательских приложений. - person Petrakeas; 10.11.2015

Используйте приложение для разгона ЦП, например SetCPU (вы нужен root) и установите регулятор процессора на что-то, что не снижает тактовую частоту процессора в режиме ожидания, например, производительность.

Может быть, вы могли бы просто установить минимальную частоту процессора немного выше.

Надеюсь это поможет.

person Nanoc    schedule 05.11.2015
comment
Моя цель — заставить это работать в нормальных условиях. Спасибо за ответ. - person Petrakeas; 05.11.2015