本文档介绍了如何优化使用 Navigation SDK 构建的移动导航应用的功耗的最佳实践。同时,还介绍了采用这些做法时需要考虑的权衡。具体来说,本文档涵盖以下内容:
- 高功耗的来源,按从高到低的顺序排列。
- 按重要性顺序列出的优化功耗的策略,从帧速率开始。
- 面向最终用户的策略,用于指导应用用户如何在导航时管理设备使用情况。
为何要优化导航应用?
根据具体情况,应用用户可能会长时间运行导航指导。例如,司机和送货员可能需要长时间工作,在不熟悉的区域完成任务。在这种情况下,他们会非常依赖应用内的逐向导航。这会导致一些典型问题:
- 耗电量和充电桩可用性。频繁使用导航功能可能会导致设备电池耗电速度超出预期。虽然许多用户可以通过在车辆中为设备充电来解决此问题,但两轮车驾驶员无法这样做。
- 设备因过热而降频。即使是持续为设备充电的用户也可能会遇到问题。长时间的高功耗会导致设备发热,进而导致温控降频和随后的性能损失。
逐向导航应用依赖于屏幕、GPS 和与基站的无线电通信等耗电量大的功能,因此最好优化移动应用的耗电量。此外,您还应考虑目标受众群体的耗电量需求,以便在性能和优化耗电量之间做出适当的权衡。
哪些功能最耗电?
本部分将与高耗电量相关的应用内 activity 分为两类:
- 屏幕呈现
- 位置信息动态
屏幕呈现
在移动导航应用中,屏幕渲染通常会导致最高的耗电量。每次设备在屏幕上绘制地图和其他界面元素时,都会依赖 GPU 和 CPU 处理。同样,当用户长时间保持该屏幕开启状态时,也会消耗更多电量。
在一定程度上,您可以预期,依赖可见地图进行导航的司机或乘客会消耗大量电量,尤其是当他们连续使用应用数小时时。在此场景中,应用还会在屏幕上以更高的速率执行渲染,因为地图会实时更新。在某些情况下,屏幕几乎可以连续重绘,尤其是在用户从一个位置驾车到另一个位置而不停车时。
位置信息动态
除了屏幕渲染之外,还有两项导航活动会消耗设备电量:
- 无线电基站和 GPS 使用情况
- 位置信息更新和共享,例如提供预计到达时间或报告车队中车辆的位置。
GPS 和手机无线装置通讯都依赖于耗电的启动操作:GPS 必须找到卫星,手机无线装置必须与基站协商并建立连接。出于这些原因,即使移动网络无线装置会保持 20-30 秒的活跃状态以尽量减少启动成本,这些服务在导航期间基本上也会持续运行。操作系统会控制这些设置,您无法在应用中轻松配置这些设置。
对于位置信息更新,耗电量因不可预测的因素而异。例如,设备与移动基站之间的距离决定了耗电量,因为设备会使用继续导航所需的最低信号,以避免切换基站。因此,在网络连接不佳的区域中导航的设备会比靠近基站的设备消耗更多电量。此外,某些应用可能会与中央车队管理服务分享位置信息更新,因此需要与服务器通信才能完成此操作。
优化应用的耗电量
在导航应用中优化耗电量面临的挑战是,这些应用严重依赖耗电量大的资源,这限制了您在不做出权衡(例如限制屏幕使用)的情况下减轻影响的选择。本部分提供了一份列表,其中列出了您在优化应用时可以采取的方法,并按效果从高到低进行了排序。
更改帧速率
屏幕会以称为帧速率的频率更新其显示内容,通常以每秒帧数 (FPS) 为单位进行衡量。由于屏幕渲染会消耗大量 CPU 和 GPU 处理资源,因此您可以降低帧速率以节省电量。
降低帧速率后,地图渲染和互动手势(例如平移、缩放或旋转)可能会显得不那么流畅。为了在能效与响应迅速的用户体验之间取得平衡,您可以保持较低的基准帧速率,并在用户互动活跃期间动态提高帧速率。
在 iOS 设备上,Maps SDK for iOS 会在GMSMapView 上公开 preferredFrameRate 属性,以控制帧速率。下表显示了您可以调整的 GMSFrameRate 值:
| Swift 值 | Objective-C 值 | 说明 |
|---|---|---|
.powerSave |
kGMSFrameRatePowerSave |
使用最低帧速率以节省电池用量。 |
.conservative |
kGMSFrameRateConservative |
使用中位帧速率可提供更流畅的渲染效果并节省处理周期。 |
.maximum |
kGMSFrameRateMaximum |
使用设备的最高帧速率(低端设备为 30 FPS,高端设备为 60 FPS)。 |
如需了解详情,请参阅 Navigation SDK for iOS 文档中的 GMSFrameRate。
如需直接设置首选帧速率,请为 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 协议并实现以下方法:
- 在
mapView:willMove:中,检查镜头移动是否由用户手势触发。如果gesture为true,则将preferredFrameRate设置为最大值。 - 在
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 引发的所有事件。这并不适合所有使用场景,如果驾驶员需要查看地图并遵循视觉引导,则不建议这样做。以下屏幕截图展示了在有效导航期间切换地图视图的对照比较。
|
|
使用深色地图样式
考虑将地图样式设置为使用深色主题,以减少在屏幕上呈现地图所需的能量。
Navigation SDK 使用 Google Maps SDK for iOS 呈现地图,其中包含用于为应用中的任何非导航地图视图设置样式的选项。导航视图还支持强制深色模式。由于屏幕类型不同,此设置对每部设备的影响可能不尽相同,但在某些情况下,此设置有助于节省电量。最近的一项研究发现,在某些屏幕上,深色模式节省的电量取决于屏幕的初始亮度。例如,与亮度已调整为最大亮度 30-50% 的屏幕相比,深色模式在亮度设为最大亮度的屏幕上更省电。在为应用使用深色模式时,请务必考虑这一点,因为省电效果与最终用户设置的屏幕亮度有关。
如需详细了解如何修改导航界面,请参阅修改导航界面。
云端地图样式设置需要一个地图 ID,该 ID 表示已在 Google 控制台项目中创建的服务器端地图配置。如需详细了解如何创建地图 ID,请参阅地图 ID 开发者文档。如需详细了解如何设计和部署基于云端的地图样式,请参阅有关创建和管理基于云端的地图样式的开发者文档。
更改 GPS 位置信息更新频率
在考虑设备发送的位置信息更新所产生的耗电量时,应更多地关注位置信息更新的频率,而不是传输中发送的数据量。
您无法在 Navigation SDK 中直接控制此行为。 使用非 GPS 地址信息来源(手机基站和 Wi-Fi)时,也应遵循同样的建议。
为用户提供相关信息
应用的用户可能想知道如何优化其耗电量。为了帮助用户降低应用的功耗,请建议用户执行以下操作:
- 锁定手机
- 将导航应用置于后台
- 尽可能在不使用地图的情况下进行导航
- 降低屏幕亮度,方法是为 OLED 和 AMOLED 屏幕使用深色模式,或启用自动调节亮度功能
- 使设备保持凉爽
- 连接到车载 Wi-Fi(如果有)
测量功耗
您可以使用专业级工具来测量能耗,但这些工具通常难以获得或成本高昂。 应用和 IDE 性能分析工具(例如 Android Studio 中的 Power Profiler 和 XCode Organizer 中的电池用量窗格)可测量功耗,但可能很难消除后台进程的影响或设置性能基准来进行测量。在某些情况下,设备限制可能会阻止获取必要的数据。
您可以使用专用电源监控硬件并修改电池连接配置,市面上也有相关产品和服务可帮助您实现此目的。请注意,以这种方式修改设备可能会导致设备保修失效。