Android GLSurfaceView에서 매우 빠르게 드로잉 버퍼를 가져 오는 메소드를 찾고 있습니다.android ANativeWindow_lock API가 GLSurfaceView에서 작동하지 않습니다.
나는 glreadpixel이이 일을 할 수 있음을 알고 있지만, glreadpixel은 그리기 버퍼를 얻기에는 너무 느립니다.
30fps를 유지하는 버퍼를 읽고 싶습니다.
ANativeWindow API를 내가 무엇을 찾고처럼 보인다 ..
내가 GLSurfaceView에 대한 ANativeWindow의 API의 예를 발견 할 수 없었다.
내 절차 :.. JNI 코드에
- 보내기 GLSurfaceView 표면 (. GLSurfaceView.getHolder()를 사용 getSurface()) ** ANativeWindow_fromSurface 방법을 사용하여 창 핸들을 가져
- **
- 설정 윈도우 버퍼 **
- 잠금 표면 얻을 윈도우 버퍼는 **
- 은 **이 버퍼를 사용하여
- UnlockAndPost 창을 무언가를 **
안드로이드 "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] 연결 : 이미 연결 (현재 = 1, REQ = 2)
I는 렌더러 또는 메인 쓰레드 또는 onSurfaceChanged에 onDrawFrame에서이 코드를 시도한다.
하지만 항상 -22 값을 반환합니다.
나는이 api를 잘못된 장소라고 부릅니까?
GLSurfaceView에 ANativeWindow_lock을 사용할 수 있습니까?
어떤 도움이 정말 감사합니다 ~
이를 제거하려고 노력 해요? memset ((void *) & buffer, 0, sizeof (buffer)); ? –