問題タブ [surfaceflinger]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - Android アニメーション: vsync に追いつく
バックグラウンド
さまざまなコンテンツを 1080p@60HZ 出力 (大画面) に表示することを含む、まだ定義されていないハードウェア プラットフォーム (現在 Ouya と MK802IV、すべて Android 4.1+ をテスト中) 用の Android ベースのアプリケーションを開発しています。
このアプリケーションでは、スクロールを表示します。スクロールとは、テレビのニュース ステーションで見られるように、画面を右から左にスクロールするテキストです。私は 60fps で完全に動作する実用的な実装 (SurfaceView を拡張して手動で描画する) を持っています。
問題
アプリケーションの残りの部分がより高度なフラグメント アニメーションの実行を開始すると、スクロールのフレームレートが低下します。私にとって、この低下は (最適化後でも) 完全に正常ですが、フレームレートが 30 ~ 40 fps に低下した場合でも、スクロールが元の速度と滑らかさを維持するようにしたいと考えています。テキストの動きの滑らかさはユーザーにとって非常に目立つため、これは非常に重要です。
Android 4.1 以降で使用されている Vsync とチップル バッファリングについて調べたところ、実行可能な解決策が 2 つあります。
解決策 1: VSYNC を遅くする
アプリケーションまたはデバイス全体で Vsync をグローバルに 30 fps まで下げるとよいでしょう。残念ながら、eglSwapInterval はテスト済みのどのデバイスでも機能しません。
- アプリケーション/デバイス全体を一定の低いフレームレートで強制的にレンダリングする方法はありますか?
解決策 2: レンダリングしているフレームを知る
デバイスには Android 4.1+ が搭載されているため、SurfaceView はトリプル バッファリング スキームの一部としてレンダリングされます。実装がどのフレームをレンダリングしているかを何らかの形で知っていれば、それに応じてスクロール テキストを描画できます。特にサブピクセル描画は問題ではありません。
私は SystemClock.uptimeMillis を使用して素朴な実装を試みましたが、この方法で取得したタイムスタンプは大きく変動しました (60fps でも、フレーム間の時間差は一定とはほど遠いものでした)。
どのフレームがレンダリングされているか、またはスキップされたフレームの数を知る方法はありますか?この情報を使用してフレームを適切にレンダリングできますか?
テキスト スクロールの主題にアプローチする方法について他に何か提案はありますか?
追加情報
テキストが長く (1000 文字以上)、最大 20 文字/画面、最大 4 ピクセル/秒で 1920x280 ピクセルのウィジェットに表示され、フォントが等幅でない場合があることに注意してください。OpenGL と GlSurfaceView を使用することを考えましたが、ここでは問題は同じままです。システムの負荷が高い場合でも、現在何をレンダリングしているかを知る必要があります。
プラットフォームに依存するソリューションも大歓迎です。どのプラットフォームがサポートされるかを制御できるからです (非常に狭く、主流の範囲ではない可能性があります)。
よろしくお願いいたします。
android - android-layer の内容の読み込み
Surfaceflinger によって合成されるレイヤーのコンテンツを読み取るプロジェクトに取り組んでいます。
具体的には、合成されるレイヤーがすべて1 ビット 0 またはすべて 0 ビットであるかどうかを確認する必要があります。
これは、SurfaceFlinger による合成の前にいくつかの最適化を適用するためです。
(独自のログ メッセージを追加して) adb-logcatを介してバッファーの作成を追跡しましたが、レイヤーの実際のコンテンツを読み取る方法が見つかりませんでした。
これが可能かどうか誰か教えてもらえますか?
android - Surfaceflinger 通知
Android の表示プロセスでは、SurfaceFlinger が重要な役割を果たします。
ところで、アプリレベルでSurfaceFlingerの起動・停止に気づく方法はありますか?
または、観察する他の表示プロセスはありますか?
タッチしてから表示するまでの時間差について知りたいです。
android - GDB を介して surfaceflinger で使用されているディスプレイを表示する
surfaceflinger コア ダンプがあり、フレーム バッファの破損を探しています。IMX6を搭載したFreescaleボードでAndroid JB 4.3を実行しており、1つの内部LVDSと別の外部モニター(HDMI経由で接続)の2つのディスプレイがあります
どのディスプレイがコアに関連付けられているかを把握しようとしています-私が見ている破損したフレームバッファが内部または外部モニターに接続されているかどうか。
gdb では、次を実行します。
(gdb) f
0x4014e6a0 in android::SurfaceFlinger::doComposition (this=0x406f1008) at frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp:1031
1031 postFramebuffer();
(gdb)
(gdb) p mDisplays.mVector
$15 = (android::SortedVector, android::sp > >) {
= {
= {
_vptr.VectorImpl = 0x4015a6e0,
mStorage = 0x4099efa8,
mCount = 2,
mFlags = 0,
mItemSize = 12
}, }, }
(gdb)
gdb で VectorImpl 要素を表示する方法はありますか? コア スタック フレームで現在使用されている要素を確認するにはどうすればよいですか?
アドバイスをいただければ幸いです。
android - フレームバッファが表示される直前にフィルタを適用する
Android デバイスの画面に表示されているものに何らかの画像フィルターを適用したいと考えています。イメージ フィルタの最も単純な例は、画面に表示される直前にフレーム バッファに適用されるセピア フィルタです。念のために言っておきますが、この効果はアプリだけでなく、システム全体に適用したいと考えています。