2015-11-05 33 views
8

私のアプリは、フレームごとに実際には単純なビュー(回転、平行移動)のプロパティを変更します。私はフレームを落としていたかどうかを確認するために、Androidのパフォーマンス記事でアドバイスされたsystraceを使用しました。デバイスが静止しているがタッチされたときのAndroidアニメーションのパフォーマンス低下

何か本当に予期せぬことが起こりました。デバイスが静止していても(たとえ画面に触れたとしても)CPU使用率が高くなり、systraceのアラートが表示され、GPUレンダリングプロファイラの赤い部分が長くなりました。私が回転したり、本当に高速に装置を振ると、すべてがOKでした。

以下は結果のリンクです。 Shakeは、デバイスを本当に速く回転させたときのことです。no_shakeは机の上に置かれたままです。

私は、単一の翻訳アニメーション:source codeを使用する非常に単純なテストアプリケーションを作った。

SYSTRACE:no shakeshake

CPU使用率: enter image description here

GPUプロファイラ:enter image description here

は、フレームレートが滑らかであるシェイクSYSTRACE、を見るとなぜHW_VSYNC_0とHW_VSYNC_ON_0ラインデータがありませんか?どのようにしてCPU周波数を読み取ることができますか(私はトレースをキャプチャするときにオプションを有効にしました)。

私の理論は、デバイスがCPUの周波数を下げる可能性があるということでした。どのように私はsystraceでこれを読むことができますか?私はこの仮説をテストするために第三者のアプリを使用しました。それは以下のように真です。では、この問題を避けるために私は何ができますか?

enter image description here

なぜデバイスはこれをしているのですか?最初は、デバイスが加速度計のデータを使用して、使用されていないかどうかを理解し、CPUの周波数を下げたと考えました。しかし、CPUの周波数を上げるためには、デバイスを本当に揺さぶらなければなりません。通常の人のようにそれを保持することは、CPUの周波数を増加させません。

私はそれがたくさんの質問であることを知っていますが、Androidのグラフィックスパイプラインに関するすべての関連記事を読んで、私はアイデアがありません。

問題は5.1 Androidの問題を実行しているソニーのXperia Z3に発生したアンドロイド6.

を実行しているNexus 5の上で再現可能ではなかったアップデート

それは/パフォーマンスの問題は、CPUによって引き起こされているようですGPUスロットリング。同じデバイス、Xperia Z3は、Android 4.4を使用している場合、クロック速度を低下させても、Systraceによればより優れたパフォーマンスを示します。また、振るとスピードが上がらない。

CPUスピードを上げるために必要な振る舞いについては、デバイスを縦長から横向きに、またはその逆に回転しようとすると、CPUクロックがトリガされることに気付きました(アプリが向きを変えなくても)。だから、私はこのジェスチャーが監視されている理由は、可能性のあるオリエンテーション変更をスピードアップすることだと思う

+0

[Snapdragon 810 s * ck badly ...そのためです:)](http://arstechnica.com/gadgets/2015/ 04 /詳細なスナップドラゴン-810s-熱問題/) – Selvin

+0

Nexus 5 Snapdragon 800にはこの問題はありません。私は、この問題がAndroidのバージョン、OEMなどと関係しているかどうかわかりません。 – Petrakeas

+0

多分現在は(6またはそれより新しいカーネルで)修正されています...私はまだ "big"と "small" "刃物のコア – Selvin

答えて

3

いくつかの観測...

モバイルデバイス、クアルコムのチップをベースに、特にものは、積極的に電力消費を最小化するためにCPUクロックを下げます。ポリシーがbit heavy-handedの場合もあります。また、現在のワークロードを処理するために必要な数にアクティブコアの数を減らそうとします。

"CPU n"行だけで、systraceの出力を見ると、 "shake"トレースが4つのコアすべてをビジーにしているのに対し、 "no shake"トレースは2または3あなたがそれを振っていないとき、システムの負荷は軽くなります。 CPUガバナの調整方法によっては、クロック周波数などの変更が行われている可能性があります。

「freq」タグをsystraceコマンドラインに追加することによって、さまざまなクロックの値の変更を確認できます。この情報を取得するには、ルートデバイスが必要な場合があります。 CPUクロック、GPU帯域幅、その他の難解な項目の設定変更が表示されるはずです。 の変更がと報告されているだけですので、録画が開始された後に画面をタップして何かをすることをお勧めします。

私はこれを知っていると確信していますが、そうでない人には:実行にN CPUサイクルがかかり、CPUが100%の速度で動作している場合、タスクはT秒で完了します。 CPUが50%の速度で動作している場合、タスクは2 * T秒で完了します。 CPU使用率を測定するツールでは、CPUが稼動している時間の割合と一定期間のアイドル時間を決定します。ツールが1秒間監視していて、タスクが1秒間実行されている場合は、100%の使用率です。 CPUクロックが高く、タスクが0.5秒で完了すると、その使用率は50%です。低クロックの利点は、電力消費が非線形であることです。したがって、どちらの方法でもN個のCPUサイクルを使用している間は、低速と低速の構成でバッテリを少なくします。クロックが低くなると、実行に時間がかかり、アプリケーションがフレームを落としてしまいます。このため、画面に触れるとクロックが上がります.CPUガバナーは、あなたがデバイスとやり取りしていることを認識し、できるだけスムーズに対話できるようにシステムを構成します。

あなたはVSYNCのものを無視する必要があります。いくつかのデバイスでは、SurfaceFlingerは、アウトオブフェーズのソフトウェア生成のVSYNC信号(詳細についてはgoogle "dispsync")を使用しています。ディスプレイのリフレッシュフェンスからのフィードバックを使用してドリフトしているかどうかを判断し、必要に応じてハードウェアVSYNCを短時間オンに戻して再同期します。 (FWIW、問題の行にあなたが投稿したトレースのデータを持っています)

+0

ありがとうございます。私は、デバイスを揺するときにCPUの増加が起こる理由についての質問を更新しました。 SystraceとCPU周波数に関しては、トレースをキャプチャしたときにADBで "freq"タグが有効になり、いくつかのデータが表示されましたが、クリックすると値は表示されません。それはデバイスが根づいていないためですか? – Petrakeas

+0

また、ハードウェアのVSYNCがONになってから、VSYNC_appがゼロオフセットのHW_VSYNC_0と同時に発生したときにトレースに注目しました。これは、私は2フルフレーム遅れがあることを意味します。 1.5フレーム遅延(ここで説明したように)(http://stackoverflow.com/questions/27947848/understanding-necessity-of-android-vsync-signals))の場合、VSYNC_appはHW_VSYNC_0の後に少し発生する必要があります。私はこの権利を理解しましたか? – Petrakeas

+0

すべてのデバイスがアプリのディススピンオフセットを設定しているわけではありません。問題のデバイスのboardconfigをチェックする必要があります。私はアプリとSFのイベントがNexus 5のVSYNCからオフセットされているのを見ていると思うが、おそらくソニーではそうではないだろう。トレース内のCPU行は、振れたデバイスでより多くのアクティビティを表示します。あなたはそれが何であるかを理解するために掘り下げなければならないでしょう。 "freq"行にデータが表示されない場合は、トレースの期間中は何も変わらない(そうでない)か、ルートとして実行されていないときに通過しないだけです。 – fadden

0

SetCPU(rootが必要です)のようなCPUオーバークラックアプリを使用して、パフォーマンスのようにアイドル状態でCPUのアンダークロックを起こさないようにCPUのガバナーを設定します。

おそらく、ちょうどCPUの最小周波数を少し高く設定できます。

これが役に立ちます。

+0

私の目標は、この作業を正常にすることです状況。しかし、答えをありがとう。 – Petrakeas

関連する問題