最佳化應用程式的耗電量

本文說明最佳做法,協助您在使用 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 協定,並實作下列方法:

  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.Navigation SDK iOS 試用版應用程式顯示資料備份試用版
試用版應用程式執行中,未顯示地圖檢視畫面。
圖 2. 執行試用版應用程式,但未顯示地圖檢視畫面。請注意,剩餘時間和距離,以及道路貼齊位置仍在更新中。

使用深色地圖樣式

建議您將地圖樣式設為深色主題,減少在螢幕上算繪地圖所需的能源。

Navigation SDK 使用 Google Maps SDK for iOS 算繪地圖,其中包含設定應用程式中任何非導航地圖檢視區塊樣式的選項。導航檢視區塊也支援強制使用深色模式。由於螢幕類型不同,這項設定對每部裝置的影響可能不盡相同,但在某些情況下確實可以節省電力。近期研究發現,深色模式在某些螢幕上節省的電量,取決於螢幕一開始的亮度。舉例來說,如果螢幕亮度設為全亮,深色模式會比亮度已調整為最大亮度 30% 到 50% 的螢幕更省電。在應用程式中使用深色模式時,請務必考量這一點,因為省電效果會與使用者設定的螢幕亮度有關。

如要進一步瞭解如何修改導航 UI,請參閱「修改導航 UI」。

在 iPhone 15 Pro 上執行的 Navigation SDK,採用深色地圖樣式。
圖 3. 採用深色地圖樣式的 Navigation SDK
使用 mapID 設定 GMSMapView,代表專案中定義的雲端式地圖樣式。

如要使用雲端式地圖樣式設定,您需要具備地圖 ID,代表在 Google 控制台專案中建立的伺服器端地圖設定。如要進一步瞭解如何建立地圖 ID,請參閱地圖 ID 開發人員說明文件。如要進一步瞭解如何設計及部署雲端式地圖樣式設定,請參閱開發人員說明文件,瞭解如何建立及管理雲端式地圖樣式設定。

變更 GPS 位置更新頻率

考量裝置傳送位置更新的耗電量時,請著重於位置更新的頻率,而非傳輸的資料量。

您無法在 Navigation SDK 中直接控制這項功能。 使用非 GPS 地點來源 (行動網路和 Wi-Fi) 時,也適用相同建議。

向使用者說明

應用程式的使用者可能想知道如何最佳化耗電量。為協助使用者降低應用程式耗電量,請建議他們採取下列做法:

  • 鎖定手機
  • 將導航應用程式移到背景
  • 盡可能在不顯示地圖的情況下使用導航功能
  • 降低螢幕亮度,例如在 OLED 和 AMOLED 螢幕上使用深色模式,或啟用自動調整亮度功能
  • 保持裝置涼爽
  • 連上車內 Wi-Fi (如有)

測量耗電量

您可以使用專業級工具測量耗電量,但這類工具通常難以取得或價格昂貴。應用程式和 IDE 分析工具 (例如 Android Studio 中的 Power Profiler 和 XCode Organizer 中的 Battery Usage 窗格) 可測量耗電量,但可能難以移除背景程序的影響,或設定效能基準來測量。在某些情況下,裝置限制可能會導致無法存取必要資料。

您可以使用特殊用途的電源監控硬體,並修改電池連線設定,市面上也有商業產品和服務可協助您完成這項操作。請注意,以這種方式修改裝置可能會導致裝置保固失效。