在android ndk中使用OPENGL显示帧(RGB数据)时,帧速率太慢
我在JNI中使用OpenGL ES绘制从C源代码(MPEG2编解码器)返回的帧(RGB数据)。为此,我使用OpenGL的在android ndk中使用OPENGL显示帧(RGB数据)时,帧速率太慢,android,opengl-es,android-ndk,Android,Opengl Es,Android Ndk,我在JNI中使用OpenGL ES绘制从C源代码(MPEG2编解码器)返回的帧(RGB数据)。为此,我使用OpenGL的glTexSubImage2D()函数创建了一个纹理并绘制RGB数据。但是使用这个函数,我甚至不能得到7帧每秒。正如我所研究的那样,使用OpenGL我们可以获得22 FPS 是否有任何其他特定函数通过android ndk显示图像,该函数的性能优于该函数(glTexSubImage2D())。 我引用了这个来绘制从编解码器返回的帧 提前感谢。Android 2.2中添加了一组本
glTexSubImage2D()
函数创建了一个纹理并绘制RGB数据。但是使用这个函数,我甚至不能得到7帧每秒。正如我所研究的那样,使用OpenGL我们可以获得22 FPS
是否有任何其他特定函数通过android ndk显示图像,该函数的性能优于该函数(glTexSubImage2D()
)。
我引用了这个来绘制从编解码器返回的帧
提前感谢。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;
}
#包括
JNIEXPORT jint JNICALL Java\u com\u somecompany\u someapp\u someclass\u drawonbitmap(JNIEnv*env、jobject对象、jobject位图)
{
int iReturn;
AndroidBitmapInfo信息;
空*像素;
iReturn=AndroidBitmap_getInfo(环境、位图和信息);
如果(iReturn<0)
{
返回;
}
iReturn=AndroidBitmap_lockPixels(环境、位图和像素);
如果(iReturn<0)
{
返回;
}
//在这里直接绘制位图
//
//使用结构构件:
//信息跨步
//信息宽度
//信息高度
//info.format(例如ANDROID_位图_格式_RGB_565)
if(pixels!=NULL)//我们之前锁定了像素
{
AndroidBitmap_解锁像素(环境、位图);
}
返回0;
}
参考文章指出,将像素直接绘制到位图中更快-您尝试过吗?您是针对操作系统版本<2.2的系统吗?@BitBank感谢您的回复。。是的,我正在使用参考链接的代码绘制图像。。操作系统版本是3.0。正如你们所说的,它速度更快,但我的帧速率很低…请告诉我解决方案。。我希望帧速率在20fps左右。我使用了直接写入位图的方法,然后使用canvas.drawBitmap。我通常获得60帧以上的速度。在像G1这样的廉价手机上,我可以获得>30fps的速度。@BitBank再次感谢您的回复。。我有C语言的MPEG2编解码器。。Earliar我从C向android发送帧,并使用canvas.drawBitmap()绘制图像。。但是这个过程太慢了,因为它需要来自JNI的回调。所以我必须切换到OpenGL以避免回调。不确定回调是什么意思。在Java中创建位图,通过JNI将其传递给C代码。使用位图函数获取指向位的指针,设置位,然后在Java代码中绘制它。快速高效。