Проблемы с производительностью Android (JUCE), когда НЕ касается экрана

Я переношу приложение для iOS, созданное в JUCE, на Android (в настоящее время в бета-версии). У меня какое-то странное поведение, когда я получаю звуковые сбои и пропадание кадров графического интерфейса, которые появляются только тогда, когда НЕ касаюсь экрана.

Приложение использует OBOE с JUCE 5.4.0 и скомпилировано только для Android 8.0 и выше. Как ни странно, эта проблема возникает только на Galaxy S9 (тесты на Note 8, Note 9, Xiaomi mi A1 и некоторых других устройствах проходят нормально). Я попытался выполнить сброс до заводских настроек на Galaxy S9.

Я новичок в разработке Android.


person Mark Watt    schedule 19.12.2018    source источник
comment
Вы пробовали на другом S9? Возможно, есть аппаратная ошибка только с этим.   -  person OrangeDog    schedule 20.12.2018


Ответы (1)


То, что вы испытываете, вероятно, связано с масштабированием частоты ЦП на Galaxy S9, который агрессивно снижает частоту ЦП, когда к экрану не прикасаются. Это приводит к недостаточной вычислительной пропускной способности, из-за чего ваше приложение занимает слишком много времени внутри обратного вызова аудио, что приводит к опустошению/глюкам.

Чтобы убедиться в этом, используйте systrace и профайлер Android Studio. Системная трасса покажет вам как опустошение звука, так и частоту процессора.

Нажмите на экран во время трассировки, и вы увидите, как частота процессора увеличивается, а затем вскоре после этого падает.

Если это так, есть несколько вещей, которые вы можете попробовать:

  1. Убедитесь, что вы используете наиболее оптимальные флаги компилятора -Ofast или -O3.
  2. Используйте недавно выпущенный класс StabilizedCallback в Oboe, который был разработан именно для этой цели - он будет пытаться поддерживать работу процессора, чтобы избежать его уменьшения.
  3. Отслеживайте опустошения (доступные через AudioStream::getUnderruns()) и уменьшайте вычислительную нагрузку до тех пор, пока они не прекратятся.

Если у вас по-прежнему возникают проблемы, опубликуйте свой код или, по крайней мере, достаточно кода, чтобы воспроизвести проблему, на github, и я постараюсь взглянуть.

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

person donturner    schedule 20.12.2018
comment
Спасибо @donturner за ответ. 1. К сожалению, проблему не решил. 2. Звучит многообещающе, есть ли у вас какие-либо предложения о том, как реализовать это в приложении JUCE? Я изо всех сил пытаюсь найти какую-либо информацию о StabilizedCallback. - person Mark Watt; 27.12.2018
comment
Вам нужно будет изменить исходный код JUCE (где-то здесь: github.com/WeAreROLI/JUCE/blob/master/modules/), чтобы обернуть существующий обратный вызов в файл oboe::StabilizedCallback. Вот пример: github .com/google/oboe/blob/master/samples/MegaDrone/src/main/ - person donturner; 31.12.2018