本文說明最佳做法,協助您在使用 Navigation SDK 建構的行動導航應用程式中,盡可能降低耗電量。同時,本文也說明採用這些做法時應考量的取捨。具體來說,本文涵蓋下列內容:
- 高耗電來源,由高到低排序。
- 策略:最佳化耗電量的策略,依重要性排序,從影格率開始。
- 使用者策略:教導應用程式使用者如何在導航時管理 裝置用量。
為什麼要最佳化導航應用程式?
視情況而定,應用程式使用者可能會長時間執行導航。舉例來說,司機和外送員可能需要長時間工作,在不熟悉的地區完成任務。在這種情況下,他們會高度仰賴應用程式內的即時路線指引。這會導致一些常見問題:
- 電池耗電量和充電器可用性。頻繁使用導航功能可能會導致裝置電池耗電速度比預期快。雖然許多使用者可以透過在車內為裝置充電來解決這個問題,但兩輪車駕駛人無法這麼做。
- 裝置因過熱而降速。即使使用者持續為裝置充電,也可能遇到問題。長時間高耗電可能會導致裝置發熱,進而造成熱節流和後續效能損失。
即時路況導航應用程式仰賴耗電量大的功能,例如螢幕、GPS,以及與行動通信基地台的無線電通訊,因此最佳做法是最佳化行動應用程式的耗電量。此外,您也應考量目標對象的耗電量需求,以便在效能和最佳化耗電量之間做出適當的取捨。
哪些功能最耗電?
本節將耗電量高的應用程式內活動分為兩類:
- 畫面轉譯
- 最新位置
畫面轉譯
在行動導航應用程式中,螢幕算繪通常是耗電量最高的部分。每次裝置在螢幕上繪製地圖和其他 UI 元素時,都會仰賴 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% 的螢幕更省電。在應用程式中使用深色模式時,請務必考量這一點,因為省電效果會與使用者設定的螢幕亮度有關。
如要進一步瞭解如何修改導航 UI,請參閱「修改導航 UI」。
如要使用雲端式地圖樣式設定,您需要具備地圖 ID,代表在 Google 控制台專案中建立的伺服器端地圖設定。如要進一步瞭解如何建立地圖 ID,請參閱地圖 ID 開發人員說明文件。如要進一步瞭解如何設計及部署雲端式地圖樣式設定,請參閱開發人員說明文件,瞭解如何建立及管理雲端式地圖樣式設定。
變更 GPS 位置更新頻率
考量裝置傳送位置更新的耗電量時,請著重於位置更新的頻率,而非傳輸的資料量。
您無法在 Navigation SDK 中直接控制這項功能。 使用非 GPS 地點來源 (行動網路和 Wi-Fi) 時,也適用相同建議。
向使用者說明
應用程式的使用者可能想知道如何最佳化耗電量。為協助使用者降低應用程式耗電量,請建議他們採取下列做法:
- 鎖定手機
- 將導航應用程式移到背景
- 盡可能在不顯示地圖的情況下使用導航功能
- 降低螢幕亮度,例如在 OLED 和 AMOLED 螢幕上使用深色模式,或啟用自動調整亮度功能
- 保持裝置涼爽
- 連上車內 Wi-Fi (如有)
測量耗電量
您可以使用專業級工具測量耗電量,但這類工具通常難以取得或價格昂貴。應用程式和 IDE 分析工具 (例如 Android Studio 中的 Power Profiler 和 XCode Organizer 中的 Battery Usage 窗格) 可測量耗電量,但可能難以移除背景程序的影響,或設定效能基準來測量。在某些情況下,裝置限制可能會導致無法存取必要資料。
您可以使用特殊用途的電源監控硬體,並修改電池連線設定,市面上也有商業產品和服務可協助您完成這項操作。請注意,以這種方式修改裝置可能會導致裝置保固失效。