2013-01-29 38 views
23

ビデオを画面上で回転できるようにする必要があるため、VideoViewの現在の実装と同様に、MediaPlayer上に便利なレイヤーを提供するカスタムTextureViewを作成しました。 This Android blog postはTextureViewについては、次の言葉:Android TextureViewとVideoViewのパフォーマンス

SurfaceViewのコンテンツは、アプリケーションのウィンドウ内に住んでいないので、それを変換することができません効率的に(拡大縮小、移動、回転させます)。これにより、ListViewまたはScrollView内でSurfaceViewを使用することが困難になります。 SurfaceViewは、フェーディングエッジやView.setAlpha()などのUIツールキットの一部の機能とも適切に対話できません。

これらの問題を解決するために、Android 4.0では、ハードウェアアクセラレーションされた2DレンダリングパイプラインとSurfaceTextureに依存するTextureViewという新しいウィジェットが導入されています。 TextureViewはSurfaceViewと同じ機能を提供しますが、SurfaceViewとは異なり、通常のビューとして動作します。たとえば、TextureViewを使用してOpenGLシーンまたはビデオストリームを表示することができます。 TextureView自体は、アニメーションやスクロールなどが可能です。

しかし、TextureViewがビデオを再生するのに苦労しているようです。テスト対象のデバイスには、1.2GhzのRockchip RK3066デュアルコアCPU、QuadコアMali-400 GPU(ARM)、および1GB RAMが搭載されています。このデバイスでVideoViewsを使用している同じコードは正常に動作しますが、TextureViewは再生中に「吃音」または特定のデバイスに応じてまったく表示されません(左上の白い四角の黒いボックス)。 TextureViewsは、Intel提供のx86「デバイス」を使用して、エミュレータで正常に動作します。

このパフォーマンスが予想されていますか、問題を見つけるために他の場所を調べる必要がありますか?ありがとう

+0

私はあなたの特定の設定についてよく分かりません。あなたのsmlといくつかの関連するJavaを見て参考になる可能性があります。テクスチャビューにウェイトが適用されていますか?どの警告がUIエディタでスローされていますか?彼らはあなたを助けるかもしれません。 –

+0

あなたは問題を解決することができましたか、またはmediaplayerでのtextureviewの使用を避ける方が良いでしょうか? –

+0

私たちは 'TextureView'を使用しなくなりました –

答えて

18

はい、TextureViewと期待されています。 TextureViewは、GPUで直接合成されたSurfaceViewとは異なり、レンダリングのためにビデオを通常のビューコンポジットに変換します(デコードパイプラインは、SurfaceViewを配置する画面の領域に直接レンダリングします)。 TextureViewのレンダリングはハードウェアアクセラレーションですが、柔軟性を高めるためにさらに多くのステップを実行しており、明確なパフォーマンスヒットがあります。また、UIスレッドで実行されているコードは、SurfaceViewとは異なり、TextureViewに影響することがあります。

追加情報:

1

あなたはこのarticle

を見ることができますSurfaceViewとTextureViewは、同様の役割を埋めるが、非常に異なる実装を持っています。どちらが最善かを判断するには、トレードオフの理解が必要です。 TextureViewはView階層の適切な市民であるため、他のViewと同様に動作し、他の要素と重なったり重なったりする可能性があります。任意の変換を実行し、簡単なAPI呼び出しで内容をビットマップとして取り出すことができます。

TextureViewに対する主なストライキは、合成ステップのパフォーマンスです。 SurfaceViewを使用すると、コンテンツは、SurfaceFlingerが合成するレイヤー、つまりオーバーレイと理想的には別々のレイヤーに書き込まれます。 TextureViewでは、View合成は常にGLESで実行され、その内容の更新によって他のView要素も再描画されることがあります(TextureViewの上に配置されている場合など)。ビューのレンダリングが完了したら、アプリケーションのUIレイヤーをSurfaceFlingerで他のレイヤーと合成する必要があります。そのため、すべての可視ピクセルを効果的に合成します。フルスクリーンのビデオプレーヤーや、ビデオの上にレイヤーされたUI要素である他のアプリケーションの場合、SurfaceViewの方がはるかに優れたパフォーマンスを提供します

関連する問題