バックグラウンド
さまざまなコンテンツを 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 を使用することを考えましたが、ここでは問題は同じままです。システムの負荷が高い場合でも、現在何をレンダリングしているかを知る必要があります。
プラットフォームに依存するソリューションも大歓迎です。どのプラットフォームがサポートされるかを制御できるからです (非常に狭く、主流の範囲ではない可能性があります)。
よろしくお願いいたします。