Pebble の強みの 1 つは、長いバッテリー寿命です。これは、低電力ディスプレイ技術の使用、バックライトの控えめな使用、可能な限りプロセッサをスリープさせることに一部起因しています。したがって、高電力 API を誤用したり、省電力メカニズムの動作を妨げたりするアプリは、ユーザーのバッテリー寿命を損なうことになります。このガイドでは、アプリでバッテリーを消耗させる一般的な原因について、それらを回避するための提案とともに説明します。
Developer Dashboard で公開されたアプリには、最小しきい値のデータが収集されると、バッテリーグレードが関連付けられます。これを使用して、アプリがどの程度のバッテリー電力を消費するかの大まかなアイデアを得ることができます。長時間起動されるウォッチフェイスやアプリの場合、このグレードが A ~ C の範囲にあることを確認することが優先事項であるべきです。この評価システムの詳細については、Appstore Analytics をお読みください。
ウォッチは電力を節約するために可能な限りスリープしようとするため、ウォッチを起きたままにするアプリは大きなバッテリーペナルティを被ります。このようなアプリの例には、アニメーション、センサー、Bluetooth 通信、バイブレーションを頻繁に使用するアプリが含まれます。
このような消耗の一般的な原因は、頻繁なディスプレイ更新を引き起こす長時間実行されるアニメーションです。たとえば、1 秒ごとに 0.5 秒の Animation を再生するウォッチフェイスは、1 分に 1 回だけ再生するウォッチフェイスよりも速くバッテリーを消耗します。後者のアプローチでは、ウォッチがスリープするための時間がはるかに長くなります。
static void tick_handler(struct tm *tick_time, TimeUnits changed) {
// Update time
set_time_digits(tick_time);
// Only update once a minute
if(tick_time->tm_sec == 0) {
play_animation();
}
}
これは、アニメーションを作成する別の方法である短い間隔の Timer を使用するアプリにも適用されます。電力をさらに節約するために、ユーザーにアニメーションを削減または無効にするオプションを提供すること、およびアプリの機能や美観に不可欠でないアニメーションを削除または短縮することを検討してください。
ただし、すべてのアニメーションが悪いわけではありません。アニメーションがよりインテリジェントな時間に再生される場合、バッテリーの効率的な使用を維持できます。たとえば、ユーザーが画面を見るために腕を上げているとき(pebble_glancing_demo を参照)、またはタップや手首の振りが検出されたときのみです:
static void accel_tap_handler(AccelAxisType axis, int32_t direction) {
// Animate when the user flicks their wrist
play_animation();
}
accel_tap_service_subscribe(tap_handler);
多くのウォッチフェイスは、TickTimerService で SECOND_UNIT 定数値を使用して 1 秒に 1 回不必要にティックしますが、ディスプレイは 1 分に 1 回しか更新しません。代わりに MINUTE_UNIT を使用することで、ウォッチが 1 分間に起動される回数が減少します。
// Only tick once a minute, much more time asleep
tick_timer_service_subscribe(MINUTE_UNIT, tick_handler);
可能であれば、電力をさらに節約するために、秒針のティックやアニメーションを無効にする選択肢をユーザーに提供してください。非常にミニマルなウォッチフェイスでは、HOUR_UNIT 値を使用して 1 時間に 1 回だけ更新することもできます。
この要因は、Pebble Time Round ユーザーにとって特に重要です。このプラットフォームでは、バッテリー容量が減少しているため、1 秒ごとにアニメーションが再生されるウォッチフェイスは、これを 1 日以下に短縮する可能性があります。このプラットフォームで電力を節約するために、ティック更新を削減する構成オプションを提供することを検討してください。
Pebble のオンボード加速度計とコンパスセンサーを頻繁に使用するアプリも、ウォッチがスリープ状態になるのを防ぎ、より多くのバッテリー電力を消費します。AccelerometerService API には、サンプリングレートと更新ごとに受信されるサンプル数を構成する機能があり、データをより頻度の低い更新にバッチ処理できます。更新をより頻度を低くすることで、バッテリーはより長く持続します。
// Batch samples into sets of 10 per callback
const uint32_t num_samples = 10;
// Sample at 10 Hz
accel_service_set_sampling_rate(ACCEL_SAMPLING_10HZ);
// With this combination, only wake up the app once per second!
accel_data_service_subscribe(num_samples, accel_data_handler);
同様に、CompassService API では、方位の更新にフィルターを設定できるため、たとえば 45 度の角度変化ごとにのみアプリに通知されるようにできます。
// Only update if the heading changes significantly
compass_service_set_heading_filter(TRIG_MAX_ANGLE / 36);
さらに、Dictation API を頻繁に使用すると、ウォッチが起きたままになり、Bluetooth 接続を維持するためのペナルティも発生します。Storage API を使用して以前のユーザー入力を記憶し、適切な場合は代わりに以前の入力のリストを提示して、この API の使用を減らすことを検討してください。
static void dictation_session_callback(DictationSession *session, DictationSessionStatus status,
char *transcription, void *context) {
if(status == DictationSessionStatusSuccess) {
// Display the dictated text
snprintf(s_last_text, sizeof(s_last_text), "Transcription:\n\n%s",
transcription);
text_layer_set_text(s_output_layer, s_last_text);
// Save for later!
const int last_text_key = 0;
persist_write_string(last_text_key, s_last_text);
}
}
上記で示したように、AppMessage API を頻繁に使用してデータを送受信すると、Bluetooth 接続がより応答性の高い状態になり、はるかに多くの電力を消費します。メッセージが送信された後の短い時間で、接続は低電力状態に戻ります。
「スニフ間隔」は、API が電話からの新しいメッセージをチェックする頻度を決定し、可能な限りデフォルトの SNIFF_INTERVAL_NORMAL 状態のままにしておく必要があります。電力を節約し機能を維持するために、通信活動をどの程度まれにできるか、および Bluetooth 接続を介して取得されたデータを Storage API を使用してキャッシュして更新の頻度を減らす方法(たとえば、ウォッチフェイスの天気情報)を検討してください。
大量のデータをすばやく転送するために低減されたスニフ状態を使用する必要がある場合は、転送が完了したらすぐに低電力状態に戻るようにしてください:
// Return to low power Bluetooth state
app_comm_set_sniff_interval(SNIFF_INTERVAL_NORMAL);
バックライト LED も、バッテリー電力の大きな消費者です。システムレベルのバックライト設定では、ボタンが押されるたびに数秒間バックライトがオンになる場合があります。この設定は開発者の手には負えませんが、アプリは操作に必要なボタンの押下回数を最小限に抑えることで、バックライトのオン時間を短縮するように機能できます。たとえば、長いスクロール MenuLayer の代わりに ActionBarLayer を使用して、1 回のボタン押下で一般的なアクションを実行します。
Light API を使用してバックライトを手動でオンにすることができますが、非常に短い期間のみ使用する必要があります(もしあれば)。バックライトを常にオンにしているアプリは、数時間以上持続しません。バックライトを長時間オンにしておく必要がある場合は、できるだけ早く自動モードに戻るようにしてください:
// Return to automatic backlight control
light_enable(false);
電気を機械エネルギーに変換する物理的なコンバーターとして、バイブレーションモーターも多くの電力を消費します。ユーザーは、Quiet Time を使用するか、通知のバイブレーションをオフにして電力を節約することを選択できますが、アプリもこの努力に貢献できます。Vibes API の使用を最小限に抑え、アプリが発するバイブレーションを無効にするオプションをユーザーに提供するようにしてください。バイブレーターの電力消費を減らすもう 1 つの方法は、使用されるカスタム シーケンスの長さを短縮することです。
Pebble での電力消費と、アプリ設計の選択を通じてバッテリー寿命を延ばす方法について詳しく学ぶには、2014 年の Developer Retreat で行われた以下のプレゼンテーションをご覧ください。