Практика Android Live Wallpaper для повышения производительности и экономии батареи?

Легко найти много статей, посвященных реализации Live Wallpapers для новичков, в которых рассматриваются основные вопросы, связанные с Surfaces и т.д.

Но как насчет профессионального развития Live Wallpapers? Каковы наилучшие методы структурирования кода в правильном направлении, чтобы обеспечить хорошую производительность, низкое энергопотребление (чтобы сэкономить заряд батареи) и лучше всего подходят для разных устройств?

Если возможно, некоторые примеры кода, охватывающие эти проблемы, будут отличными.

Ответ 1

Потребляемая мощность...
1) Самое главное, безусловно, в том, что ваши обои должны отключиться, когда они не видны. Пример куба обрабатывает это правильно, удаляя runnable callbacks в onDestroy(), onSurfaceDestroyed() и onVisibilityChanged() (когда visible == false).
2) Кроме того, наибольшей детерминантой утечки мощности будет ваша частота кадров. Активация 24 кадров в секунду будет потреблять гораздо больше сока, чем часы, которые просто обновляются со скоростью 1 кадр/с, чтобы сделать свой тик. Нет никакого способа обойти это, кроме как обучить пользователя, чтобы ожидания были разумными. Экшн-игра убьет вашу батарею, будь то приложение или живые обои.

Performance...
Рисование на холсте имеет преимущество простоты, но для очень сложных обоев вам нужно будет использовать OpenGL. Там GLWallpaperService и AndEngine. Фондовые обои привязаны к использованию RenderScript (вам может показаться полезным найти этот код в дереве исходных текстов Android - гораздо сложнее, чем пример куба в SDK). И были некоторые разговоры о расширении libGDX для обработки обоев.

Лучший вариант... Ну, так же, как и остальная часть Android: вам нужно проектировать свои работы с точки зрения масштабируемых пропорций, запросить устройство и соответствующим образом настроить. Для простых обоев обычно достаточно, чтобы масштабировать ваше произведение в onSurfaceChanged(), где вам заданы ширина и высота в качестве параметров. В некоторых случаях вы можете просмотреть полные DisplayMetrics.