Как оптимизировать энергопотребление приложения

В этом документе описаны рекомендации по оптимизации энергопотребления в мобильном приложении для навигации, созданном с помощью Navigation SDK. В то же время в ней описываются компромиссы, которые следует учитывать при использовании этих практик. В частности, в этом документе рассматриваются следующие вопросы:

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

Зачем оптимизировать навигационное приложение?

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

  • Расход заряда батареи и доступность зарядных станций. При активном использовании навигации батарея устройства может разряжаться быстрее, чем ожидалось. Многие пользователи могут решить эту проблему, заряжая устройство в автомобиле, но у водителей двухколесных транспортных средств такой возможности нет.
  • Троттлинг из-за перегрева. Проблемы могут возникнуть даже у пользователей, которые постоянно заряжают свои устройства. Высокое энергопотребление в течение длительного времени может привести к нагреву устройства, что приведет к тепловому троттлингу и последующей потере производительности.

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

Что потребляет больше всего энергии?

В этом разделе действия в приложении, связанные с высоким энергопотреблением, делятся на две категории:

  • Отрисовка экрана
  • Попутчики

Отрисовка экрана

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

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

Попутчики

Помимо отрисовки экрана, заряд батареи расходуется на два других действия:

  • Использование вышек сотовой связи и GPS
  • Обновление и передача данных о местоположении, например для расчета времени прибытия или отслеживания транспортных средств в автопарке.

GPS и сотовые приемопередатчики требуют энергоемких операций запуска: GPS должен найти спутники, а сотовые приемопередатчики должны согласовать с вышками и установить соединение. По этим причинам они работают практически непрерывно во время навигации, хотя приемопередатчики остаются активными в течение 20–30 секунд, пытаясь минимизировать затраты на запуск. Операционная система управляет этими настройками, которые вы не можете легко настроить в своем приложении.

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

Оптимизируйте энергопотребление приложения

Оптимизировать энергопотребление в навигационных приложениях сложно, потому что они сильно зависят от энергоемких ресурсов. Это ограничивает возможности по снижению энергопотребления без компромиссов, таких как ограничение использования экрана. В этом разделе перечислены подходы к оптимизации приложения в порядке убывания их эффективности.

Как изменить частоту кадров

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

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

На устройствах iOS Maps SDK для iOS предоставляет свойство preferredFrameRate в GMSMapView для управления частотой кадров. В таблице ниже приведены значения GMSFrameRate, которые можно корректировать.

Значение Swift Значение Objective-C Описание
.powerSave kGMSFrameRatePowerSave Используйте минимальную частоту кадров, чтобы экономить заряд батареи.
.conservative kGMSFrameRateConservative Используйте среднюю частоту кадров, чтобы обеспечить более плавную отрисовку и сэкономить циклы обработки.
.maximum kGMSFrameRateMaximum Используйте максимальную частоту кадров для устройства (30 кадр/с для бюджетных устройств, 60 кадр/с для устройств высокого класса).

Дополнительную информацию можно найти в разделе GMSFrameRate документации по Navigation SDK для iOS.

Чтобы задать предпочтительную частоту кадров напрямую, присвойте значение свойству mapView.preferredFrameRate:

Swift

// Reduce the frame rate to conserve battery:
mapView.preferredFrameRate = .powerSave

Objective-C

// Reduce the frame rate to conserve battery:
mapView.preferredFrameRate = kGMSFrameRatePowerSave;

Динамически менять частоту кадров при жестах

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

Для этого примените протокол GMSMapViewDelegate и реализуйте следующие методы:

  1. В методе mapView:willMove: проверьте, было ли движение камеры инициировано жестом пользователя. Если gesture – true, установите максимальное значение preferredFrameRate.
  2. В mapView:idleAtCameraPosition: восстановите режим энергосбережения для preferredFrameRate, когда камера перейдет в режим ожидания.

В примере кода ниже показано, как динамически настраивать частоту кадров во время жестов пользователя.

Swift

class YourViewController: UIViewController {

  @IBOutlet weak var mapView: GMSMapView!

  override func viewDidLoad() {
    super.viewDidLoad()
    mapView.delegate = self

    // Set a baseline low frame rate to conserve power:
    mapView.preferredFrameRate = .powerSave
  }
}

// MARK: - GMSMapViewDelegate
extension YourViewController: GMSMapViewDelegate {
  func mapView(_ mapView: GMSMapView, willMove gesture: Bool) {
    // Increase frame rate during user gestures for smooth interaction:
    if gesture {
      mapView.preferredFrameRate = .maximum
    }
  }

  func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) {
    // Restore the power-saving frame rate when gestures finish:
    mapView.preferredFrameRate = .powerSave
  }
}

Objective-C

@interface YourViewController : UIViewController <GMSMapViewDelegate>
@end

@implementation YourViewController {
  GMSMapView *_mapView;
}

- (void)viewDidLoad {
  [super viewDidLoad];
  _mapView.delegate = self;

  // Set a baseline low frame rate to conserve power:
  _mapView.preferredFrameRate = kGMSFrameRatePowerSave;
}

#pragma mark - GMSMapViewDelegate

- (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture {
  // Increase frame rate during user gestures for smooth interaction:
  if (gesture) {
    mapView.preferredFrameRate = kGMSFrameRateMaximum;
  }
}

- (void)mapView:(GMSMapView *)mapView
    idleAtCameraPosition:(GMSCameraPosition *)position {
  // Restore the power-saving frame rate when gestures finish:
  mapView.preferredFrameRate = kGMSFrameRatePowerSave;
}

@end

Вы не можете контролировать, какую яркость экрана устанавливает конечный пользователь и как долго он держит экран включенным, но можете предоставить ему возможность навигации без карты. Это позволит конечному пользователю выбрать этот вариант для экономии энергии. Например, если водители регулярно работают в одном и том же районе, им может не требоваться частое использование карт. Чтобы включить навигацию без карты, задайте пункт назначения и запустите ведение по маршруту в Navigation SDK, но не показывайте карту.

Добавьте строку кода, чтобы скрыть GMSMapView:

mapView.isHidden = true

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

Демонстрационное приложение с видимой картой.
Рисунок 1. Демонстрационное приложение iOS Navigation SDK, показывающее демо Data Back
Демонстрационное приложение работает, но карта не видна.
Рисунок 2. Демонстрационное приложение, в котором не показывается карта. Обратите внимание, что оставшееся время и расстояние, а также привязанное к дороге местоположение по-прежнему обновляются.

Как использовать темный стиль карты

Чтобы снизить энергопотребление при отрисовке карты на экране, используйте тёмную тему.

Navigation SDK отрисовывает карты с помощью Google Maps SDK для iOS, который содержит параметры для стилизации любых ненавигационных представлений карты в вашем приложении. Представление навигации также поддерживает принудительный темный режим. Из-за различий в типах экранов это может по-разному влиять на устройства, но в некоторых случаях позволяет экономить заряд батареи. Недавнее исследование показало, что количество энергии, которое экономится при использовании тёмной темы на некоторых экранах, зависит от того, насколько ярким был экран изначально. Например, тёмная тема экономит больше энергии на экранах с полной яркостью, чем на экранах, яркость которых уже настроена на 30–50 % от максимальной. Это важно учитывать при использовании тёмной темы в приложениях, поскольку экономия энергии будет зависеть от того, как конечный пользователь настроит яркость экрана.

Подробнее о том, как изменить интерфейс навигации…

Navigation SDK на iPhone 15 Pro с темным стилем карты.
Рис. 3. Navigation SDK с темным стилем карты
Настройте GMSMapView с идентификатором карты, который представляет облачный стиль карты, определенный в вашем проекте.

Для работы с облачными стилями карт необходим идентификатор карты, который представляет конфигурацию карты на стороне сервера, созданную в проекте Google Console. Подробнее о том, как создать идентификатор карты… Подробную информацию о разработке и развертывании облачных стилей карт вы найдете в документации для разработчиков по созданию облачных стилей карт и управлению ими.

Как изменить частоту обновления местоположения по GPS

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

Вы не можете напрямую управлять этим в Navigation SDK. Те же рекомендации относятся к использованию источников местоположения, не связанных с GPS (мобильная связь и Wi-Fi).

Обучающие материалы для пользователей

Пользователи вашего приложения могут захотеть узнать, как оптимизировать энергопотребление. Чтобы снизить энергопотребление приложений, посоветуйте пользователям сделать следующее:

  • Заблокируйте телефон.
  • Переведите приложение для навигации в фоновый режим.
  • По возможности используйте навигацию без карты.
  • Уменьшите яркость экрана. Для этого включите тёмную тему (если у вас экран OLED или AMOLED) или адаптивную яркость.
  • Не допускайте перегрева устройства
  • Подключитесь к Wi-Fi в автомобиле, если он доступен.

Измерение энергопотребления

Для измерения энергопотребления можно использовать профессиональные инструменты, но их часто трудно или дорого получить. Приложения и инструменты профилирования IDE, такие как Power Profiler в Android Studio и панель Battery Usage в XCode Organizer, измеряют энергопотребление, но при этом может быть сложно исключить влияние фоновых процессов или установить базовый уровень производительности для сравнения. В некоторых случаях ограничения на устройстве могут препятствовать получению доступа к необходимым данным.

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