私のアプリは、フレームごとにいくつかの非常に単純なビュー (回転、平行移動) のプロパティを変更します。Android のパフォーマンスに関する記事でアドバイスされているように、systrace を使用して、フレームがドロップしているかどうかを確認しました。
本当に予想外のことが起きました。デバイスが静止しているとき (画面に触れていても)、CPU 使用率が高くなり、systrace でアラートが発生し、GPU レンダリング プロファイラーの赤い部分が長くなりました。デバイスを非常に速く回転させたり振ったりすると、すべて問題ありませんでした。
以下、結果のリンクです。Shake
デバイスを非常に速く回転させたno_shake
とき、机の上に置いたままにしたときです。
ソース コードという 1 つの翻訳アニメーションを使用する、非常に単純なテスト アプリを作成しました。
フレームレートがスムーズなシェイク systrace を見ると、HW_VSYNC_0 および HW_VSYNC_ON_0 ラインにデータがないのはなぜですか? CPU 周波数を読み取るにはどうすればよいですか (トレースをキャプチャするときにオプションを有効にしました)。
この問題に関して、私の理論では、デバイスが CPU 周波数を下げている可能性があります。systrace でこれを読み取るにはどうすればよいですか? この仮説をテストするためにサードパーティのアプリを使用しましたが、以下に示すように真実です。では、この問題を回避するにはどうすればよいでしょうか。
デバイスがこれを行う理由は何ですか? 最初は、デバイスが加速度計のデータを使用して使用されていないかどうかを理解し、CPU 周波数を下げたと思いました。しかし、CPU 周波数を上げるには、デバイスを激しく振る必要があります。通常の人のようにそれを保持しても、CPU 周波数は増加しません。
たくさんの質問があることは承知していますが、Android グラフィックス パイプラインに関する関連記事をすべて読んだので、アイデアがありません。
この問題は、Android 5.1 を実行している Sony Xperia Z3 で発生しました。この問題は、Android 6 を実行している Nexus 5 では再現できませんでした。
アップデート
パフォーマンスの問題は、CPU/GPU スロットリングが原因のようです。同じデバイスの Xperia Z3 で Android 4.4 を実行すると、クロック速度は低下しますが、Systrace によるとパフォーマンスが向上します。また、振っても速度が上がりません。
CPU 速度を上げるために必要なシェイク ジェスチャに関しては、デバイスを縦向きから横向きに、またはその逆に回転させようとすると、(アプリの向きが変わらなくても) CPU クロックが増加することに気付きました。したがって、このジェスチャーが監視される理由は、考えられる向きの変更を高速化するためだと思います。