Intereting Posts
Проблема с поддержкой Android V7 CardView Library для работы Представление списка задает настраиваемый селектор пульсаций Android runOnUiThread / AsyncTask не может разрешить CalledFromWrongThreadException Распечатайте значение логического значения в Log Горизонтальная и вертикальная полоса прокрутки в Android с планшетами? Android – получите DocumentFile с доступом для записи для любого пути к файлу на SD-карте (имея все уже приобретенные разрешения sd-карты) Как сортировать и развязывать Parcelable в массив байтов с помощью Parcel? Где выходит LogCat Log.x () при запуске тестов Android JUnit? Исходный код Google Play Services Как узнать в BroadcastReceiver, если приложение работает на переднем плане? Приложение для закрытых пользовательских карт Android-приложение сбрасывает изменения ориентации, лучший способ справиться? Maven с Android – создание файла R.java (Eclipse) Соединение Bluetooth RFCOMM / SDP с адаптером RS232 в Android Работает ли Google Cloud Messaging (GCM) с Kindle Fire?

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

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

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

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

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

Systrace: не трясти , трясти

Использование процессора: Введите описание изображения здесь

Профайлер 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. Кроме того, он не увеличивает скорость при встряхивании.

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

Solutions Collecting From Web of "Снижение производительности анимации Android, когда устройство остается неподвижным, но тронуто"

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

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

Глядя на выход 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, строки, о которых идет речь , имеют данные в найденных вами трассах.)

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

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

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