2015-11-05 7 views
8

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

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

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

Я сделал очень простое тестовое приложение, которое использует анимацию перевода: source code.

Systrace: no shake, shake

использование CPU: enter image description here

GPU профилировщика: enter image description here

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

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

enter image description here

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

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

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

Update

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

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

+0

[Snapdragon 810 s * ck badly ... вот почему:)] (http://arstechnica.com/gadgets/2015/ 04/in-deep-with-the-snapdragon-810s-heat-problems /) – Selvin

+0

Nexus 5 Snapdragon 800 не имеет этой проблемы. Я не знаю, связана ли эта проблема с версией Android, OEM или чем-то еще. – Petrakeas

+0

может быть, теперь он исправлен (в 6 или более новом ядре) ... я все еще держу ставку на переключение между «большими» и «маленькими» «ядра в snapdragon – Selvin

ответ

3

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

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

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

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

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

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

+0

Благодарим вас за объяснение. Я обновил вопрос о причине увеличения ЦП при встряхивании устройства. Что касается Systrace и частоты процессора, тег «freq» был включен в ADB, когда я захватил трассировку, и некоторые данные появляются, но когда я нажимаю на них, значение не отображается. Это потому, что устройство не внедрено? – Petrakeas

+0

Кроме того, я заметил на трассе, что при аппаратном VSYNC в ON, VSYNC_app происходит одновременно с HW_VSYNC_0 с нулевым смещением. Это означает, что у меня есть 2 полных кадра. Если у меня было 1.5 задержки кадров (как вы объяснили здесь) (http://stackoverflow.com/questions/27947848/understanding-necessity-of-android-vsync-signals), VSYNC_app должен произойти немного после HW_VSYNC_0. Я понял это правильно? – Petrakeas

+0

Не все устройства настраивают смещение dispsync для приложения. Вам нужно проверить конфигурацию платы для соответствующего устройства. Я ожидал бы, что приложения и SF-события будут смещены от VSYNC на Nexus 5, но, вероятно, не на Sony. Ряды ЦП в вашей трассе показывают больше активности в встряхиваемом устройстве; вам придется прикопаться, чтобы понять, в чем дело. Если вы не видите данные в строках «freq», либо ничто не меняется на время трассировки (маловероятно), или просто не выполняется, когда не выполняется как root. – fadden

0

Используйте некоторое приложение для разгона процессора, такое как SetCPU (вам нужен root) и установите регулятор процессора на то, что не разгоняет CPU при простоях, например Performance.

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

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

+0

Моя цель - сделать эту работу нормальной обстоятельства. Спасибо за ответ, хотя. – Petrakeas

 Смежные вопросы

  • Нет связанных вопросов^_^