56
モバイルにおける電力最適化のための 1プラクティス 於保 俊(OhooooKLab EMDroidKaigi (2015/04/25)発表資料

Droid kaigiプレゼン

Embed Size (px)

Citation preview

モバイルにおける電力最適化のための1プラクティス

於保 俊(Ohoooo) KLab EM部DroidKaigi (2015/04/25)発表資料

自己紹介

● 於保 俊(おほ すぐる) Tw:@ohomagic● 環境学修士・・・● 六本木のクラブKLabでエンジニアリングマネージャー

やってます● 仕事は、「何でも屋?」

○ 広く浅く様々な技術課題解決をしています○ KLabのEM部の工作担当です

○ N88BASIC(大昔)→Java(大学)→PHP(KLab)→最近

は、Python、C#、C・・・色々・・・Android(うっ● 最近子供が生まれて、いつか一緒にコード書く

ことを夢見ています

ネタスライド一応ソフトウェアのエンジニアです

今日のお話

● はじめに○ なぜ消費電力が重要なのか?○ 電力最適化の課題○ 電力最適化の先行事例等

● 電力計測の仕組み○ 電力はどうやって測るか?○ 今回の装置の紹介

● 実例として○ いろんなアプリを測ってみた 何が電気を食うのか?○ AndroidWearのWatchFaceの消費電力を減らしてみた

● まとめ

はじめに

なぜ消費電力が重要なのか?

● 電気は有限● 電池のもちが悪いとユーザー

がアクティブになってくれる時間が短くなる

● 電池のもちが悪いとネガティブなユーザー体験につながる

● 場合によってはアンインストールの理由にもなる

画像:Wikipediaより引用

さらに 「ウェアラブルの台頭」

● AndroidWear / Apple Watch …● バッテリー容量はさらに小さい● モバイルSoCがメインで最適化がまだ進んでない

後藤弘茂のWeekly海外ニュース「スマートウォッチの電池と価格の呪縛を解き放つSoC設計と実装」

http://pc.watch.impress.co.jp/docs/column/kaigai/20141030_673678.html

● 十分とは言いがたい稼働時間

よりシビアな条件で電力消費と戦わなくてはいけない

課題

ではどうやってアプリの電力消費を最適化するか?

計測できなきゃ手が出せない

● 一般的なパフォーマンスチューニングでも○ プロファイラを使って時間がかかっているところやメモリ

の消費などを計測します○ 計測して問題個所を特定し、改善していきます

● つまり、どこで「電力」を消費しているかを計測できなきゃチューニングのしようがない

計測可能なら、計測・変更を繰り返すことでチューニングできる

先行事例

いくつかありますが、

今回参考にさせていただいたものを紹介します。

GoogleProject Volta&Battery Historian

● Project Volta○ Android5.0で導入されたバッテリーのもちをよくするた

めの各種仕組みとAPI群https://developer.android.com/about/versions/android-5.0.html#Power

● Battery Historian○ Project Voltaで導入された電源関連の統計情報を取得

し、整形して分析しやすくするツールhttps://github.com/google/battery-historian

株式会社ブリリアントサービス様

電力測定キット「パワースカウター」

● ダミーバッテリーを使って、電力を計測● 本格的な計測が廉価(2~3万円)にできるそうです

http://www.brilliantservice.co.jp/works/power_kit.html

● 今回の発表は、ここからヒントを得て、○ 自分もやってみたい!○ もっと安く簡単にできないか?○ バッテリーが取り外しできない最近の機種に対応するには

  を考えて、実験したものです

電力計測の仕組み

電力とは?

● 電圧×電流

● 電圧は回路に並列に、電流は回路に直列につないで計測する

● 電圧計と電流計があれば、電力は分かる

● 端末にUSB給電するとき「バッテリーが満充電」であれば、電力はバイパスされて端末を動かすのに「ほぼ」使われる

今回の装置の紹介

● INA226 I2Cディジタル電流・電圧・電力計モジュール

● ArduinoUno● USB充電器● USBケーブル(高速充電対応)

● 計測用スケッチ(Arduino用プログラム)● ファイル保存+グラフ描画用自作プログラム

INA226 I2Cディジタル電流・電圧・電力計モジュールとは

● I2Cでつながるデジタル電力計

● ストロベリー・リナックス通販で購入

● 1000円!● 計測レンジ ±20A 36V● 精度1.25mA 1.25mV● 小さい● キャリブレーションいらな

くて簡単

下記商品URLから引用https://strawberry-linux.com/catalog/items?code=12031

Arduino Uno

● 便利なマイコン基板● 簡単にPCと外部入

出力をつなげられて重宝します

● 3000円くらい

下記URLから引用http://www.arduino.cc/en/Main/ArduinoBoardUno

回路構成

100kΩ抵抗

Arduino用スケッチ(抜粋)

INA226との通信は

オレ工房様のスケッチを利用http://ore-kb.net/archives/150

シリアル出力部分を、受け側プログラムに合わせて改変して使用させていただきました。

約5msごとにデータ取得しますhttps://github.com/oho-sugu/powermeter

void setup(){ Wire.begin(); Serial.begin(115200); setupRegister();}

char buf[64];unsigned short voltage; // Bus Voltage (mV)unsigned short current; // Current (mA)unsigned short power; // Power (uW)unsigned long time; // time (ms)

void loop(){ voltage = (unsigned short)readRegister(INA226_REG_BUS_VOLTAGE); current = (unsigned short)readRegister(INA226_REG_CURRENT); power = (unsigned short)readRegister(INA226_REG_POWER); time = millis(); snprintf(buf, NELEMS(buf) , "T%lxV%xI%xP%x\n" , time , voltage , current , power ); Serial.print(buf); delay(5);}

ロガープログラム&計測風景

https://github.com/oho-sugu/powermeter-java

計測条件

● デバイスにUSBで給電できること● バッテリーが満充電状態であること

この装置の利点と欠点

● 利点○ 安い、簡単に作れる○ デバイスにUSB給電するだけ、手軽に使える○ USB給電に対応する機器なら何でも対応可能○ それなりに細かく消費電力のモニタリングが可能

● 欠点○ 精度は専門の機器に比べると劣る

○ 電力がバッテリーの充電に使われる場合、さらに精度が

悪化する

○ 時間解像度は数msくらいが限界→メソッド単位とかでは

さすがに電力計測できない

実例1あの有名アプリの電力消費

※注 計測対象・条件

Nexus5 Android5.1 ディスプレイ明るさ最高

通信環境 Wifiのみ

以降の計測結果は、あくまで発表者の環境での結果です。

傾向をきちんと裏付ける回数の試行を行うことはできなかったので、あくまでも参考としてとらえてください。

また個別のアプリについての批判や良否の判断の意図はありません。

端末起動時~何もしない状態~スタンバイ

最大7W超

画面OFFスタンバイ時0.2Wくらい

通常時何もしない状態1Wくらい

画面輝度最低と最大0.5Wくらい違う

ブラウザ(Chrome)使用 平均2.7W

Youtube動画再生 平均2.0W

GoogleMap使用時 平均3.7W 意外と電気食う

ここまでの結果まとめ

● 意外とGoogleMapが電気食い● 動画再生が消費電力が少ない

○ これはデコード専用回路のおかげだと推測

● ブラウザも比較的大食い○ 特に瞬間最大消費電力が多い○ スクロール時など、画面変更時に目立つ

まずは、当社アプリからお知らせ(WebView)の表示平均4.51W

ゲームプレイ中平均2.32W

データダウンロード平均2.81W

真・戦国バスター 平均2.59W

https://play.google.com/store/apps/details?id=jp.klab.senbus.android

ユニティちゃんのホームランスタジアム                  平均2.83W

https://play.google.com/store/apps/details?id=com.klab.unista

ここまでの結果まとめ

音ゲー Playgroundゲームエンジン WebViewはとても消費電力が多いゲームのコア部分であるライブでの消費電力はかなり少ない 下限もおよそ 2Wくらいと低い

真・戦国バスター Androidの標準UIコンポーネントベースで作成

増減が激しい

ユニティちゃんのホームラン競争

Unity 4 消費電力下限が約2.5Wと高いシーンやオブジェクトの激しい変更がなければ電力消費は落ち着いている

その他のゲームでも調べてみましたが

● WebViewはアニメーションやスクロール時の電力消費が激しい● 通信時、特に連続してファイルのDLをするときは電力を消費

なぞって消すパズルのゲーム平均2.38W

ひっぱるゲーム 平均2.37W

白い動物のRPG 平均2.46W

3Dレースゲーム 平均2.56W

本格オンラインRPG 平均2.60W

ここまでのまとめ

消費電力は

● ゆるい傾向として2D<3D● シーンや画面の切り替えは多いほど消費電力大● 同じゲームエンジンを使っていても違う傾向● 頻繁な通信は大きな電力消費● さらに調査が必要

とはいえ、いわゆるパフォーマンスチューニングは省電力にも貢献すると思われます

※何をすれば省電力かという体系的なノウハウは今後調査と検証が必要です

実例2AndroidWear端末で電力最適化

※注 計測対象・条件

Sumsung Gear Live 275C Android5.0.1ディスプレイ明るさ最低

以降の計測結果は、あくまで発表者の環境での結果です。

傾向をきちんと裏付ける回数の試行を行うことはできなかったので、あくまでも参考としてとらえてください。

AndroidWearのWatchFaceの消費電力測定

● まず、AndroidWearSDKのサンプルのいくつかのWatchFaceの消費電力を見ます

● そして、自作WatchFaceの消費電力チューニングを試みてみます

参考:公式ドキュメントhttps://developer.android.com/training/wearables/watch-faces/performance.html

Sample Analog 平均0.36W 一秒ごとに針が動くアナログ時計

Sample Sweep 平均0.52W 連続的に針が動くアナログ時計

Sample Tilt 平均0.53WOpenGLで描画されるふよふよする時計

Sample Digital 平均0.35W デジタル時計

自作WatchFaceを作ってみます

● 画像をぐるぐる回しています○ 秒針と分針に対応する画像をAnalog Sweepのサンプ

ルを参考になめらかに回転させながら合成して、描画し

ています

参考https://developer.android.com/samples/WatchFace/Wearable/src/com.example.android.wearable.watchface/SweepWatchFaceService.html

secondMatrix.reset();secondMatrix.setRotate(((float)mTime.second + milliseconds / 1000.0f)*6.0f,centerX,centerY);secondMatrix.postTranslate(-(float)width/7,-(float)height/7);if(mSecondScaledBitmap!=null) canvas.drawBitmap(mSecondScaledBitmap, secondMatrix,null);

自作WatchFace初期Ver 平均0.62W

気付いたこと

● 操作をやめて10秒後くらいから消費電力がガクンと下がる○ →CPUのパワーステートの切り替え?

● 処理が継続して重ければ、消費電力の高い状態が維持される

チューニング

ということは、

当たり前だけど、sleepなどを入れて処理の間隔をあければよい?

Sleepを32ms≒30FPS 平均0.49W

Sleep100ms≒10FPS 平均0.52W

減ったけど思った結果にはならなかった

● Sleep100msの時の挙動がよくわからない● とはいえ、計測しながらチューニングできるのは

可能性を感じる● 単純な図形なら、画像ではなく、直接描画した

方がいいのではないか→今後確かめたい

まとめ1

ここまで、今回は平均消費電力を一つの指標にしているが、適切ではないとやっていて思った

→様々な要因によって消費電力は変化するので、操作ごとのポイントで評価した方がいい

→この手法は、ミクロなチューニングとして使うべきで、アプリ全体の電池のもちを評価する長期間のテストと併用するべき

とはいえ、ピンポイントでチューニングの参考にとてもなります

まとめ2

● 簡単な装置で、比較的簡単に電力測定できる● プログラムの工夫で消費電力は抑えられる● 見えてくるエンジンやOSやハードウェアの特性● 計測可能だし、消費電力を気にしてみてもいい

のでは?

● あと、ハードウェア楽しいよ!

ご清聴ありがとうございました