このドキュメントでは、Navigation SDK を使用して構築するモバイル ナビゲーション アプリで消費電力を最適化するためのベスト プラクティスについて説明します。同時に、これらのプラクティスを採用する際に考慮すべきトレードオフについても説明します。特に、このドキュメントでは次の内容について説明します。
- 消費電力の高いソースが、高いものから低いものの順に表示されます。
- 消費電力を最適化するための戦略(重要度の高い順、フレームレートから開始)。
- エンドユーザー戦略: ナビゲーション中のデバイスの使用を管理する方法をアプリユーザーに説明します。
ナビゲーション アプリを最適化する理由
状況によっては、アプリのユーザーがナビゲーション ガイダンスを長時間実行することがあります。たとえば、ドライバーや配達員は長時間働き、不慣れな地域で任務を完了することがあります。このような場合、ドライバーはアプリ内のターンバイターン方式のガイダンスに大きく依存します。これにより、次のような一般的な問題が発生します。
- バッテリーの消耗と充電器の利用可能性。ナビゲーションを頻繁に使用すると、デバイスのバッテリーが予想よりも早く消耗することがあります。多くのユーザーは、車内でデバイスを充電することでこの問題に対処できますが、二輪車のドライバーはそれができません。
- 熱によるデバイスのスロットリング。デバイスを継続的に充電しているユーザーでも、問題が発生することがあります。長時間にわたって消費電力が高い状態が続くと、デバイスが発熱し、サーマル スロットリングが発生してパフォーマンスが低下する可能性があります。
ターンバイターン方式のナビアプリは、画面、GPS、携帯電話基地局との無線通信など、消費電力の大きい機能に依存しているため、モバイルアプリの消費電力を最適化することをおすすめします。また、パフォーマンスと消費電力の最適化の適切なトレードオフを行うために、ターゲット ユーザーの消費電力のニーズを考慮する必要があります。
最も電力を消費するものは何ですか?
このセクションでは、消費電力の大きいアプリ内アクティビティを次の 2 つのカテゴリに分類します。
- 画面レンダリング
- 現在地情報のあっぷでー
画面レンダリング
モバイル ナビゲーション アプリでは、通常、画面のレンダリングが最も消費電力が大きくなります。デバイスが画面に地図やその他の UI 要素を描画するたびに、GPU と CPU の処理に依存します。同様に、ユーザーが画面を長時間オンにしたままにすると、電力消費量が増加します。
ある程度は、表示された地図を頼りにナビゲーションを行うドライバーやライダーの消費電力が高くなることが予想されます。特に、アプリを何時間も連続して使用する場合はそうです。このシナリオでは、地図がリアルタイムで更新されるため、アプリは画面のレンダリングをより高いレートで実行します。特に、ユーザーが停止せずに場所から場所へと移動している場合、画面がほぼ継続的に再描画されることがあります。
現在地情報のあっぷでー
画面のレンダリングに加えて、ナビゲーション アクティビティのうち次の 2 つもデバイスの電力を消費します。
- 無線基地局と 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 を使用して地図をレンダリングします。この SDK には、アプリ内のナビゲーション以外の地図ビューのスタイルを設定するオプションが含まれています。ナビゲーション ビューでは、ダークモードの強制もサポートされています。画面タイプの違いにより、すべてのデバイスに同じように影響するわけではありませんが、場合によっては消費電力を節約できる可能性があります。最近の調査によると、一部の画面でダークモードによって節約される電力量は、画面の明るさによって異なります。たとえば、ダークモードでは、明るさが最大値の 30 ~ 50% にすでに調整されている画面よりも、明るさが最大に設定されている画面の方が、より多くの電力を節約できます。これは、アプリでダークモードを使用する際に考慮すべき重要な点です。電力の節約は、エンドユーザーが画面の明るさをどのように設定するかによって異なるためです。
ナビゲーション UI の変更について詳しくは、ナビゲーション UI を変更するをご覧ください。
Cloud ベースのマップのスタイル設定には、Google Console プロジェクトで作成されたサーバーサイドの地図構成を表すマップ ID が必要です。マップ ID の作成について詳しくは、マップ ID のデベロッパー向けドキュメントをご覧ください。Cloud ベースの地図のスタイルを設計してデプロイする方法について詳しくは、Cloud ベースの地図のスタイルを作成して管理するに関するデベロッパー向けドキュメントをご覧ください。
GPS 位置情報の更新頻度を変更する
デバイスから送信される位置情報の更新による電力使用量を検討する際は、送信されるデータ量よりも、位置情報の更新頻度に注目してください。
これは、Navigation SDK で直接制御できるものではありません。 同じアドバイスが、GPS 以外の位置情報のソース(モバイルと Wi-Fi)の使用にも適用されます。
ユーザーに情報を提供する
アプリのユーザーは、消費電力を最適化する方法を知りたいと思うかもしれません。アプリの消費電力を削減するには、ユーザーに次のことを行うようアドバイスしてください。
- スマートフォンをロックする
- ナビゲーション アプリをバックグラウンドに移動する
- 可能であれば、地図を使用せずにナビゲーションを使用する
- 画面の明るさを下げる(OLED 画面と AMOLED 画面でダークモードを使用するか、明るさの自動調節を有効にする)
- デバイスを冷やす
- 車載 Wi-Fi に接続する(利用可能な場合)
消費電力を測定する
プロフェッショナル向けのツールを使用して消費電力を測定することもできますが、そのようなツールは入手が困難であったり、高価であったりすることがよくあります。Android Studio の Power Profiler や XCode Organizer の Battery Usage ペインなどのアプリや IDE のプロファイリング ツールは、消費電力を測定しますが、バックグラウンド プロセスの影響を排除したり、測定の基準となるパフォーマンス ベースラインを設定したりすることが難しい場合があります。場合によっては、デバイスの制限により、必要なデータにアクセスできないことがあります。
専用の電力モニタリング ハードウェアを使用して、バッテリー接続構成を変更できます。これを行うための商用製品やサービスも存在します。この方法でデバイスを変更すると、デバイスの保証が無効になる場合があります。