Мое приложение изменяет свойства некоторых очень простых представлений (поворот, перевод) для каждого кадра. Я использовал systrace, как рекомендуется в статьях о производительности Android, чтобы проверить, не пропускаю ли я кадры.
Вышло что-то действительно неожиданное. Когда устройство стояло на месте (даже если я касался экрана), загрузка ЦП была выше, появлялись предупреждения на системной трассе, а красная часть профилировщика рендеринга графического процессора была длиннее. Когда я очень быстро вращал или встряхивал устройство, все было в порядке.
Ниже приведены ссылки на результаты. Shake
— когда я очень быстро вращал устройства, no_shake
— когда они оставались лежать на моем столе.
Я сделал очень простое тестовое приложение, в котором используется одна анимация перевода: исходный код.
Системная трасса: без встряхивания, трясти
Глядя на системную трассировку встряхивания, где частота кадров плавная, почему в строках 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 работает лучше. Также он не увеличивает скорость при тряске.
Что касается жеста встряхивания, необходимого для увеличения скорости процессора, я заметил, что когда я пытаюсь повернуть устройство из книжной ориентации в альбомную или наоборот, срабатывает увеличение тактовой частоты процессора (даже если приложение не меняет ориентацию). Итак, я думаю, причина, по которой этот жест отслеживается, заключается в том, чтобы ускорить возможную смену ориентации.