2012-02-15 8 views
0

Cソースコード(MPEG2コーデック)から返されたフレーム(RGBデータ)を描画するのにJNIでOpenGL ESを使用しています。このために、OpenGLのglTexSubImage2D()関数を使用して1つのテクスチャを作成し、RGBデータを描画しました。しかし、この機能を使用すると、私は7FPSも得られません。私がOpenGLを使って学んだように、私たちは22FPSを得ることができます。android ndkでOPENGLを使用してフレーム(RGBデータ)を表示しているときにフレームレートが遅すぎる

android-ndkによって画像を表示する他の特定の機能があります。この機能は、その機能(glTexSubImage2D())よりも優れたパフォーマンスを発揮します。 コーデックから返されたフレームを描画するには、このlinkを参照しています。

ありがとうございます。

+0

参照されている記事では、ピクセルをビットマップに直接描画する方が高速です - 試しましたか? OSバージョンが2.2未満のターゲティングシステムですか? – BitBank

+0

@BitBankは応答に感謝しています。はい私は参照リンクに与えられたコードを使用して画像を描画しています。OSバージョンは3.0です。あなたが言っているように、それは速いですが、私は低フレームレートを取得しています...私にはこのソリューションを教えてください..フレームレートは約20fpsです。 – geeta

+0

私はビットマップに直接書き込んだり、 canvas.drawBitmap。私は通常60fpsを超える。 G1のような予算の高い携帯電話では、私は> 30fpsを得るでしょう。 – BitBank

答えて

2

Android 2.2に追加された一連のネイティブビットマップ関数があり、ビットマップのコピーを作成せずにビットマップに直接アクセスできます。あなたのCコードでは、次のコードを使用します:

#include <android/bitmap.h> 

JNIEXPORT jint JNICALL Java_com_somecompany_someapp_someclass_drawonbitmap(JNIEnv *env, jobject obj, jobject bitmap) 
{ 
int iReturn; 
AndroidBitmapInfo info; 
void *pixels; 

    iReturn = AndroidBitmap_getInfo(env, bitmap, &info); 
    if (iReturn < 0) 
    { 
     return <some error>; 
    } 
    iReturn = AndroidBitmap_lockPixels(env, bitmap, &pixels); 
    if (iReturn < 0) 
    { 
     return <some error>; 
    } 

    // Draw directly into the bitmap here 
    // 
    // use the structure members: 
    // info.stride 
    // info.width 
    // info.height 
    // info.format (e.g. ANDROID_BITMAP_FORMAT_RGB_565) 

    if (pixels != NULL) // we previously locked the pixels 
    { 
     AndroidBitmap_unlockPixels(env, bitmap); 
    } 
    return 0; 
} 
関連する問題