2012-04-20 15 views
7

FFmpegに基づいてムービープレーヤーを作成しました。それはうまく動作します。デコードはかなり速いですが、LG P970(Cortex A8 with Neon)では、640 x 424解像度のYUV2RGB変換を含む平均70フレーム/秒のビデオストリームがあります。しかし、ボトルネックが1つあります。キャンバスに描いています。ビットマップ描画のパフォーマンスを向上させる方法

私はjnigraphicsネイティブライブラリを使って画像データをネイティブ側のビットマップに埋め込み、次にこのビットマップをSurfaceViewのCanvasに描画します。これはかなりシンプルで一般的なアプローチですが、640 x 424解像度のビットマップの場合、描画に44 msかかるため、fpsを23に減らすことができ、このテクニックは使用できなくなります。

ビットマップを大幅に高速に描画する方法はありますか?私は完全にOpenGLES 2を使用してネイティブコードでレンダリングすることを好むだろうが、私はそれもslowすることができます読んでいる。だから今何?...

できるだけ早くビットマップをレンダリングするにはどうすればよいですか?

+0

SurfaceViewのバッファにネイティブコードから直接アクセスする方法はありませんか?カメラのプレビューはこのafaikを行います。 – zapl

+0

AFAIKいいえ、少なくともNDKを使用する標準的な方法はありません。もちろん、Androidソースとリンクすることは可能ですが、互換性の問題を引き起こします。 – vitakot

答えて

3

GLES1.xで描画します。 GLES2.xを使用する一般的な主な理由となるシェーダに対して、GLES2を使用する必要はありませんし、少なくともあなたの質問の文脈ではそうではありません。ですから、簡単にするために、GLES1.xが理想的でしょう。バイトバッファを画面に描画するだけです。私のギャラクシーS(鮮やか)では約3msかかります。私の壁紙内のバイト[]のサイズは、800x480x3または1152000であり、これは作業しているものよりもはるかに大きいです。

このガイドで正しい方向を指摘してください。

http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

は、ネイティブコードからキャンバスへのアクセスの概念については、私はちょうどその完全に避けるだろうと、できるだけ多くのGPUにすべてをオフロードすることにより、OpenGLの実装に従ってください。

+0

ありがとうございます。 OpenGLES1.xに戻ります。私はOpen GLの経験がないので、私の前提は新しい方が良いということでした。私はすでにあなたが提供したリンクの記事を読んでいます。実際、私は、iOSプラットフォームであっても、Googleが私のために見つけることができたすべての関連記事を読んでいなければならないと思う。研究の一日の後、私はまだ少し失われている。 – vitakot

+0

どちらのバージョンも同じハードウェアにアクセスします。 2.0のパワーは、アクセスする追加のハードウェア(シェーダプロセッサ)から発生します。その光の中で私はそのことを言うのが難しいと思いますが、それはあなたが達成する必要があるものを決めるのと同じくらい簡単です。 –

2

GoogleIOでレプリカアイランドのプレゼンテーションを行っていた時に、デザイナーはOpenGLのdraw_texture拡張子glDrawTexfOESを使ってスクリーンにblitするのが最も速いと言っていました。 OpenGLを使用していると仮定します)。

テクスチャを回転することはできませんが、必要なようには聞こえません。

+0

あなたは正しいです、私はローテーションを気にしません。私はOpenGLES1.x(https://github.com/richq/glbuffer)を使用して、あなたが言及した関数を使用する素晴らしい例を見つけました。 – vitakot

関連する問題