2013-06-13 2 views
2

Android GLSurfaceView에서 매우 빠르게 드로잉 버퍼를 가져 오는 메소드를 찾고 있습니다.android ANativeWindow_lock API가 GLSurfaceView에서 작동하지 않습니다.

나는 glreadpixel이이 일을 할 수 있음을 알고 있지만, glreadpixel은 그리기 버퍼를 얻기에는 너무 느립니다.

30fps를 유지하는 버퍼를 읽고 싶습니다.

ANativeWindow API를 내가 무엇을 찾고처럼 보인다 ..

ANativeWindow api performance

내가 GLSurfaceView에 대한 ANativeWindow의 API의 예를 발견 할 수 없었다.

내 절차 :.. JNI 코드에

  1. 보내기 GLSurfaceView 표면 (. GLSurfaceView.getHolder()를 사용 getSurface()) ** ANativeWindow_fromSurface 방법을 사용하여 창 핸들을 가져
  2. **
  3. 설정 윈도우 버퍼 **
  4. 잠금 표면 얻을 윈도우 버퍼는 **
  5. 은 **이 버퍼를 사용하여
  6. 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을 사용할 수 있습니까?

Here is my example code

어떤 도움이 정말 감사합니다 ~

+0

이를 제거하려고 노력 해요? memset ((void *) & buffer, 0, sizeof (buffer)); ? –

답변

0

대신이 일을보십시오 : 당신이하지 않아도

http://forums.arm.com/index.php?/topic/15782-glreadpixels/

는 희망이 버퍼에 대한 ANativeWindow을 사용할 수 있습니다 직접 gralloc 전화 ...

+0

링크가 작동하지 않습니다. 사용해보기 : https://web.archive.org/web/20130406045124/http://forums.arm.com/index.php?/topic/15782-glreadpixels/ –

0

memset 작업이 필요하다고 확신하지 않습니다.

은 나를 위해 일한 :

ANativeWindow *window = ANativeWindow_fromSurface(env, surface); 
if(window > 0){ 
    unsigned char *data = ... // an RGBA(8888) image 
    int32_t w = ANativeWindow_getWidth(window); 
    int32_t h = ANativeWindow_getHeight(window); 
    ANativeWindow_setBuffersGeometry(window, w, h, WINDOW_FORMAT_RGBA_8888); 
    ANativeWindow_Buffer buffer; 
    int lockResult = -1; 
    lockResult = ANativeWindow_lock(window, &buffer, NULL); 
    if(lockResult == 0){ 
     //write data 
     memcpy(buffer.bits, data, w * h * 4); 
     ANativeWindow_unlockAndPost(window); 
    } 
    //free data... 
    ANativeWindow_release(window); 
} 
0

네이티브 부분을 호출하기 전에 당신은 GLSurface.onPause으로이 문제를 해결할 수

[Surfaceview] connect: already connected 

같은 오류 메시지가,()가 발생합니다. 네이티브 코드로 프레임 버퍼, ANativeWindow_unlockAndPost를 작성하여 ANativeWindow_lock을 렌더링 할 수 있습니다.

// Java 
SurfaceHolder holder = mGLSurfaceView.getHolder(); 
mPreviewSurface = holder.getSurface(); 
mGLSurfaceView.onPause(); 
camera.nativeSetPreviewDisplay(mPreviewSurface); 

릴리스 EGL 컨텍스트에 대해서만 GLSurfaceView onPause()를 호출합니다. GLSurfaceView는 네이티브 코드로 렌더링됩니다.

GLSurfaceView

은 적어도 나는 "가능 GLSurfaceView에 대한 ANativeWindow_lock을 사용하는 것입니다?"이 질문에 대한 해답이 될 수 있다고 생각합니다. 예.

그러나이 방법으로 창 버퍼를 사용하여보기를 렌더링 할 수 있습니다. GLSurfaceView가 일시 중지 된 후에 GLSurfaceView.Renderer onDrawFrame()이 호출되지 않기 때문에 opengl API를 사용할 수 없습니다. 그것은 여전히 ​​사용하는 것보다 더 나은 성능을 보여 주지만 여러분이 opengl API를 필요로한다면 쓸모가 없습니다.

쉐이더 호출 (onSurfaceChanged되는 GL 스레드) 내에 있어야, onSurfaceCreated() 또는 onDrawFrame()