Grafika issue trackerから少し逆流:
弾むボールはソフトウェアでレンダリングされるため、CPU 時間を消費するものは何でも遅くなります。中程度の CPU と大きなディスプレイ (Nexus 10 など) を搭載したデバイスでは、60fps に近づくことはありません。したがって、ナビゲーション バーで遊んでいるときに速度が低下しても驚かないのですが、ナビゲーション バーで遊ぶのをやめた後も速度が低下し続ける場合は、少し奇妙です。
CPU への影響が少ないため、ビデオ再生への影響は少ないはずです。
通常、このような問題の調査は、systraceを使用して「良い」状態と「悪い」状態のトレースをキャプチャし、2 つの状態を比較することから始まります。
BufferQueue の「非同期モード」の重要なポイントは、コンシューマがプロデューサについていけない場合にフレームをドロップできるようにすることです。これは主に、プロデューサーとコンシューマーが同じアプリ内にあり、潜在的に同じスレッド上にある SurfaceTexture を対象としているため、プロデューサーがコンシューマーを待機して停止すると、プログラムがハングする可能性があります。60fpsを超える必要があるということの意味はわかりませんが、レンダリングできるよりも速くディスプレイにフレームを投げていると思います...したがって、フレームレートを実際に上げているわけではありません。 Choreographer を使用していつフレームをドロップする必要があるかを判断する代わりに、BufferQueue を使用してフレームをドロップするだけです。
いずれにせよ、ロリポップが完成するかなり前の 2014 年 6 月に、私は Google を離れました。KitKat では正常に動作するのに Lollipop では動作がおかしい場合、残念ながら私は多くの洞察を提供できません。動作を簡単に再現できる場合は、問題を示すビデオをキャプチャし (問題が発生しているデバイスに別のスマートフォンを向けて、デバイスの操作方法を確認できるようにします)、http:/でバグを報告することをお勧めします。 /b.android.com/ .
OP によってアップロードされたいくつかのトレース:
kitkat トレースを見ると、SurfaceFlinger で奇妙なことが起こっています。メイン スレッドはpostFrameBuffer
非常に長い時間 (23 ~ 32 ミリ秒) 待機しています。それは最終的にウェイクアップし、CPU 行は、私がよく知らない「galcore デーモン」からのアクティビティを待機していたことを示唆しています (Vivante GPU に特有のようです)。
lollipop トレースは、キャプチャが必要なタグなしで行われたかのように、CPU 行のみを表示します。kitkat と lollipop の間で systrace キャプチャ コマンドが大幅に変更されたとは思わないので、ユーザー空間で開始されたログが消えるのに、カーネル スレッドのスケジューリングが残る理由がわかりません。sched gfx view
指定されていることを確認してください。
新しいロリポップ トレースには、約 1 秒の良好なデータしかありません。"Did Not Finish" と表示された場合、"start" レコードに一致する "end" レコードがないことを意味します。-b
フラグを使用して、systrace ロギング バッファ サイズを増やすことができます。それでも十分だと思います。
行を見る/system/bin/surfaceflinger
と、「良好な」トレースでpostFrameBuffer
は通常約 16 ミリ秒で終了することがわかりますが、まだガルコアで待機しています。388ms にズームインします (WASD キーを使用)。CPU 2 行の 388.196ms で、galcore が何かを実行していることがわかります。完了直後、表面のフリンガー列の上部にある細い線が薄い灰色 (スリープ) から緑色 (実行中) に変わります。388.548ms で、再び CPU 2 で galcore が再び実行され、その直後に surfaceflinger 行queueBuffer
で実行が開始されます。
「悪い」トレースは同じように見えます。たとえば、101.146 ミリ秒と 101.666 ミリ秒で 2 つの galcore 実行が見られ、表面のフリンガー行に同様の影響があるように見えます。主な違いは、postFrameBuffer
「良い」場合は約 16 ミリ秒、「悪い」場合は約 30 ミリ秒です。
したがって、これは行動の変化ではないようです。むしろ、物事に時間がかかり、締め切りに間に合わなくなっています。
私が知る限り、SurfaceFlinger は galcore デーモンによって停止されています。これは「良い」場合も「悪い」場合も同じです。タイミングがどのように見えるかを確認するには、Nexus デバイスで systrace を実行するか、他のデバイスからのトレースと比較します (たとえば、このケース スタディまたはこの SO の質問のもの)。doComposition
拡大すると、数ミリ秒で実行され、十分の数ミリ秒で終了することがわかりpostFrameBuffer
ます。
要約すると、良い面と悪い面はありません。悪い面と悪い面があります。:-) galcore が何かはわかりませんが、おそらく GPU OEM と話し合う必要があるでしょう。