我正在寻找从 Android GLSurfaceView 快速获取绘图缓冲区的方法。
尽管我知道 glreadpixel 可以完成这项工作,但 glreadpixel 获取绘图缓冲区的速度太慢。
我想读取保持 30 fps 的缓冲区。
ANativeWindow api 似乎是我正在寻找的..
我找不到 GLSurfaceView 的 ANativeWindow api 的任何示例。
我的程序:
- 将 GLSurfaceView 表面发送到 jni 代码。(使用 GLSurfaceView.getHolder().getSurface())**
- 使用 ANativeWindow_fromSurface 方法获取窗口句柄。**
- 设置窗口缓冲区**
- 锁定表面并获取窗口缓冲区**
- 使用这个缓冲区做一些事情**
- 解锁并发布窗口**
我使用 Android“BasicGLSurfaceView”示例尝试了以下 jni 代码。
JNIEXPORT void JNICALL Java_com_example_android_basicglsurfaceview_BasicGLSurfaceViewActivity_readSurface(JNIEnv* jenv, jobject obj, jobject surface)
{
LOG_INFO("Java_com_example_android_basicglsurfaceview_BasicGLSurfaceViewActivity_readSurface");
if (surface != 0) {
ANativeWindow *window = ANativeWindow_fromSurface(jenv, surface);
LOG_INFO("Got window %p", window);
if(window > 0)
{
int width = ANativeWindow_getWidth(window);
int height = ANativeWindow_getHeight(window);
LOG_INFO("Got window %d %d", width,height);
ANativeWindow_setBuffersGeometry(window,0,0,WINDOW_FORMAT_RGBA_8888);
ANativeWindow_Buffer buffer;
memset((void*)&buffer,0,sizeof(buffer));
int lockResult = -22;
lockResult = ANativeWindow_lock(window, &buffer, NULL);
if (lockResult == 0) { \
LOG_INFO("ANativeWindow_locked");
ANativeWindow_unlockAndPost(window);
}
else
{
LOG_INFO("ANativeWindow_lock failed error %d",lockResult);
}
LOG_INFO("Releasing window");
ANativeWindow_release(window);
}
} else {
LOG_INFO("surface is null");
}
return;
ANativeWindow_fromSurface 和 getHeight、setBuffersGeometry api 运行良好。
但是 ANativeWindow_lock api 总是无法返回 -22 值。
错误信息
[Surfaceview] 连接:已连接(cur=1,req=2)
我在渲染器或主线程或 onSurfaceChanged 的 onDrawFrame 上尝试了这段代码。
但总是返回 -22 值。
我在错误的地方调用这个 api?
是否可以对 GLSurfaceView 使用 ANativeWindow_lock?
任何帮助将不胜感激~
最佳答案
尝试这样做:
http://forums.arm.com/index.php?/topic/15782-glreadpixels/
希望您可以为缓冲区使用 ANativeWindow,这样您就不必直接调用 gralloc...
关于android ANativeWindow_lock api 不适用于 GLSurfaceView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17080745/