Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android ndk中使用OPENGL显示帧(RGB数据)时,帧速率太慢_Android_Opengl Es_Android Ndk - Fatal编程技术网

在android ndk中使用OPENGL显示帧(RGB数据)时,帧速率太慢

在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中添加了一组本

我在JNI中使用OpenGL ES绘制从C源代码(MPEG2编解码器)返回的帧(RGB数据)。为此,我使用OpenGL的
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代码中绘制它。快速高效。