Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Droid kaigiプレゼン

18,705 views

Published on

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

Arduinoとデジタル電力計を使って、Adnroidアプリの消費電力を計測します。
プログラムを変えた時、消費電力はどう変化するか見てみます。

Published in: Engineering

Droid kaigiプレゼン

  1. 1. モバイルにおける電力最適化のための 1プラクティス 於保 俊(Ohoooo) KLab EM部 DroidKaigi (2015/04/25)発表資料
  2. 2. 自己紹介 ● 於保 俊(おほ すぐる) Tw:@ohomagic ● 環境学修士・・・ ● 六本木のクラブKLabでエンジニアリングマネージャー やってます ● 仕事は、「何でも屋?」 ○ 広く浅く様々な技術課題解決をしています ○ KLabのEM部の工作担当です ○ N88BASIC(大昔)→Java(大学)→PHP(KLab)→最近 は、Python、C#、C・・・色々・・・Android(うっ ● 最近子供が生まれて、いつか一緒にコード書く ことを夢見ています
  3. 3. ネタスライド 一応ソフトウェアのエンジニアです
  4. 4. 今日のお話 ● はじめに ○ なぜ消費電力が重要なのか? ○ 電力最適化の課題 ○ 電力最適化の先行事例等 ● 電力計測の仕組み ○ 電力はどうやって測るか? ○ 今回の装置の紹介 ● 実例として ○ いろんなアプリを測ってみた 何が電気を食うのか? ○ AndroidWearのWatchFaceの消費電力を減らしてみた ● まとめ
  5. 5. はじめに
  6. 6. なぜ消費電力が重要なのか? ● 電気は有限 ● 電池のもちが悪いとユーザー がアクティブになってくれる時 間が短くなる ● 電池のもちが悪いとネガティ ブなユーザー体験につながる ● 場合によってはアンインストー ルの理由にもなる 画像:Wikipediaより引用
  7. 7. さらに 「ウェアラブルの台頭」 ● AndroidWear / Apple Watch … ● バッテリー容量はさらに小さい ● モバイルSoCがメインで最適化がまだ進んでない 後藤弘茂のWeekly海外ニュース「スマートウォッチの電池と価格の呪縛を解き放つSoC設計と実装」 http://pc.watch.impress.co.jp/docs/column/kaigai/20141030_673678.html ● 十分とは言いがたい稼働時間 よりシビアな条件で電力消費と戦わなくてはいけない
  8. 8. 課題 ではどうやってアプリの電力消費を最適化するか?
  9. 9. 計測できなきゃ手が出せない ● 一般的なパフォーマンスチューニングでも ○ プロファイラを使って時間がかかっているところやメモリ の消費などを計測します ○ 計測して問題個所を特定し、改善していきます ● つまり、どこで「電力」を消費しているかを計測で きなきゃチューニングのしようがない 計測可能なら、計測・変更を繰り返すことでチュー ニングできる
  10. 10. 先行事例 いくつかありますが、 今回参考にさせていただいたものを紹介します。
  11. 11. Google Project 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
  12. 12. 株式会社ブリリアントサービス様 電力測定キット「パワースカウター」 ● ダミーバッテリーを使って、電力を計測 ● 本格的な計測が廉価(2~3万円)にできるそうです http://www.brilliantservice.co.jp/works/power_kit.html ● 今回の発表は、ここからヒントを得て、 ○ 自分もやってみたい! ○ もっと安く簡単にできないか? ○ バッテリーが取り外しできない最近の機種に対応するには   を考えて、実験したものです
  13. 13. 電力計測の仕組み
  14. 14. 電力とは? ● 電圧×電流 ● 電圧は回路に並列に、電流は回路に直列につ ないで計測する ● 電圧計と電流計があれば、電力は分かる ● 端末にUSB給電するとき「バッテリーが満充電」 であれば、電力はバイパスされて端末を動かす のに「ほぼ」使われる
  15. 15. 今回の装置の紹介 ● INA226 I2Cディジタル電流・電圧・電力計モ ジュール ● ArduinoUno ● USB充電器 ● USBケーブル(高速充電対応) ● 計測用スケッチ(Arduino用プログラム) ● ファイル保存+グラフ描画用自作プログラム
  16. 16. INA226 I2Cディジタル電流・電圧・電力計モジュールとは ● I2Cでつながるデジタル 電力計 ● ストロベリー・リナックス 通販で購入 ● 1000円! ● 計測レンジ ±20A 36V ● 精度1.25mA 1.25mV ● 小さい ● キャリブレーションいらな くて簡単 下記商品URLから引用 https://strawberry-linux. com/catalog/items?code=12031
  17. 17. Arduino Uno ● 便利なマイコン基板 ● 簡単にPCと外部入 出力をつなげられて 重宝します ● 3000円くらい 下記URLから引用 http://www.arduino.cc/en/Main/ArduinoBoardUno
  18. 18. 回路構成 100kΩ抵抗
  19. 19. 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_VOLTAG current = (unsigned short)readRegister(INA226_REG_CURRENT); power = (unsigned short)readRegister(INA226_REG_POWER); time = millis(); snprintf(buf, NELEMS(buf) , "T%lxV%xI%xP%xn" , time , voltage , current , power ); Serial.print(buf); delay(5); }
  20. 20. ロガープログラム&計測風景 https://github.com/oho-sugu/powermeter-java
  21. 21. 計測条件 ● デバイスにUSBで給電できること ● バッテリーが満充電状態であること
  22. 22. この装置の利点と欠点 ● 利点 ○ 安い、簡単に作れる ○ デバイスにUSB給電するだけ、手軽に使える ○ USB給電に対応する機器なら何でも対応可能 ○ それなりに細かく消費電力のモニタリングが可能 ● 欠点 ○ 精度は専門の機器に比べると劣る ○ 電力がバッテリーの充電に使われる場合、さらに精度が 悪化する ○ 時間解像度は数msくらいが限界→メソッド単位とかでは さすがに電力計測できない
  23. 23. 実例1 あの有名アプリの電力消費
  24. 24. ※注 計測対象・条件 Nexus5 Android5.1 ディスプレイ明るさ最高 通信環境 Wifiのみ 以降の計測結果は、あくまで発表者の環境での結 果です。 傾向をきちんと裏付ける回数の試行を行うことはで きなかったので、あくまでも参考としてとらえてくだ さい。 また個別のアプリについての批判や良否の判断の 意図はありません。
  25. 25. 端末起動時~何もしない状態~スタンバイ 最大7W超 画面OFF スタンバイ時 0.2Wくらい 通常時 何もしない状態 1Wくらい 画面輝度最低と 最大 0.5Wくらい違う
  26. 26. ブラウザ(Chrome)使用 平均2.7W
  27. 27. Youtube動画再生 平均2.0W
  28. 28. GoogleMap使用時 平均3.7W 意外と電気食う
  29. 29. ここまでの結果まとめ ● 意外とGoogleMapが電気食い ● 動画再生が消費電力が少ない ○ これはデコード専用回路のおかげだと推測 ● ブラウザも比較的大食い ○ 特に瞬間最大消費電力が多い ○ スクロール時など、画面変更時に目立つ
  30. 30. まずは、当社アプリから お知らせ(WebView)の表示 平均4.51W ゲームプレイ中 平均2.32W データダウンロード 平均2.81W
  31. 31. 真・戦国バスター 平均2.59W https://play.google.com/store/apps/details?id=jp.klab.senbus.android
  32. 32. ユニティちゃんのホームランスタジアム                   平均2.83W https://play.google.com/store/apps/details?id=com.klab.
  33. 33. ここまでの結果まとめ 音ゲー Playgroundゲームエンジン WebViewはとても消費電力が多い ゲームのコア部分であるライブでの消費電力はかな り少ない 下限もおよそ 2Wくらいと低い 真・戦国バスター Androidの標準UIコンポーネント ベースで作成 増減が激しい ユニティちゃんの ホームラン競争 Unity 4 消費電力下限が約2.5Wと高い シーンやオブジェクトの激しい変更がなければ電力消 費は落ち着いている その他のゲームでも調べてみましたが ● WebViewはアニメーションやスクロール時の電力消費が激しい ● 通信時、特に連続してファイルのDLをするときは電力を消費
  34. 34. なぞって消すパズルのゲーム 平均2.38W
  35. 35. ひっぱるゲーム 平均2.37W
  36. 36. 白い動物のRPG 平均2.46W
  37. 37. 3Dレースゲーム 平均2.56W
  38. 38. 本格オンラインRPG 平均2.60W
  39. 39. ここまでのまとめ 消費電力は ● ゆるい傾向として2D<3D ● シーンや画面の切り替えは多いほど消費電力大 ● 同じゲームエンジンを使っていても違う傾向 ● 頻繁な通信は大きな電力消費 ● さらに調査が必要 とはいえ、いわゆるパフォーマンスチューニングは省電力にも貢献 すると思われます ※何をすれば省電力かという体系的なノウハウは今後調査と検証 が必要です
  40. 40. 実例2 AndroidWear端末で電力最適化
  41. 41. ※注 計測対象・条件 Sumsung Gear Live 275C Android5.0.1 ディスプレイ明るさ最低 以降の計測結果は、あくまで発表者の環境での結 果です。 傾向をきちんと裏付ける回数の試行を行うことはで きなかったので、あくまでも参考としてとらえてくだ さい。
  42. 42. AndroidWearのWatchFaceの 消費電力測定 ● まず、AndroidWearSDKのサンプルのいくつか のWatchFaceの消費電力を見ます ● そして、自作WatchFaceの消費電力チューニン グを試みてみます 参考:公式ドキュメント https://developer.android.com/training/wearables/watch-faces/performance.html
  43. 43. Sample Analog 平均0.36W 一秒ごとに針が 動くアナログ時計
  44. 44. Sample Sweep 平均0.52W 連続的に針が動 くアナログ時計
  45. 45. Sample Tilt 平均0.53W OpenGLで描画さ れるふよふよする 時計
  46. 46. Sample Digital 平均0.35W デジタル時計
  47. 47. 自作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);
  48. 48. 自作WatchFace初期Ver 平均0.62W
  49. 49. 気付いたこと ● 操作をやめて10秒後くらいから消費電力がガク ンと下がる ○ →CPUのパワーステートの切り替え? ● 処理が継続して重ければ、消費電力の高い状 態が維持される
  50. 50. チューニング ということは、 当たり前だけど、sleepなどを入れて処理の間隔を あければよい?
  51. 51. Sleepを32ms≒30FPS 平均0.49W
  52. 52. Sleep100ms≒10FPS 平均0.52W
  53. 53. 減ったけど思った結果にはならなかった ● Sleep100msの時の挙動がよくわからない ● とはいえ、計測しながらチューニングできるのは 可能性を感じる ● 単純な図形なら、画像ではなく、直接描画した 方がいいのではないか→今後確かめたい
  54. 54. まとめ1 ここまで、今回は平均消費電力を一つの指標にし ているが、適切ではないとやっていて思った →様々な要因によって消費電力は変化するので、 操作ごとのポイントで評価した方がいい →この手法は、ミクロなチューニングとして使うべき で、アプリ全体の電池のもちを評価する長期間の テストと併用するべき とはいえ、ピンポイントでチューニングの参考にと てもなります
  55. 55. まとめ2 ● 簡単な装置で、比較的簡単に電力測定できる ● プログラムの工夫で消費電力は抑えられる ● 見えてくるエンジンやOSやハードウェアの特性 ● 計測可能だし、消費電力を気にしてみてもいい のでは? ● あと、ハードウェア楽しいよ!
  56. 56. ご清聴ありがとうございました

×