2014-06-17 6 views
0

여러 가지 솔루션을 읽고 구현하는 데는 시간이 많이 걸렸으므로 지금까지는 아무 것도 작동하지 않으므로 여기서 다른 문제가 있다고 생각합니다.Android 컨텍스트를 잃는 Android 활동

내 기기 (Nexus 4)가 회전하거나 돌아 가기 전에 앱을 종료하면 화면이 내 GL보기의 선명한 색상으로 바뀝니다.

이것은 NDK를 사용하여 OpenGL 그리기를 수행합니다.

나는이 하나 개의 클래스는 MainActivity (페이스트 빈 등 상당히 상당한) : http://pastebin.com/ZP2hhxpA

(I 문제가 해결되지 않은 일부 솔루션에서 권장하는대로 GLSurfaceView 클래스를 다시 한)

나는 경우, 응용 프로그램을 시작하고 회전/떠나지 마라. 모든 것이 좋다. 안드로이드에 포팅 한 멋진 3D 그래픽 엔진이 있고, 사람들이 컨텍스트를 잃어 버렸을 때까지 장치가 회전 할 때까지 훌륭하게 작동한다.

내 원시 코드는 GLES 2.0 함수를 호출하고 컨텍스트 생성을 수행하지 않으며 특별한 작업을 수행하지 않습니다. onDrawFrame()에서 Android의 Java 측으로 함수를 이동하려면 여전히이 문제가 있습니다.

나는 시도했다 : - 다시 GLSurfaceView가 새로운 클래스 (변경 아무것도) 으로 - - 비활성화 회전 (안 유효한 솔루션, 문제가있을 때 여전히 일시 정지에 대한 컨텍스트 (변경 아무것도)을 잃지하기 위해 GLSurfaceView 설정 잠시 멈춤)

많은 사람들은 솔루션이 텍스처를로드하고 onSurfaceCreated() 메소드에서 쉐이더를 생성한다고 말합니다. 이것이 바로 제가하고있는 일입니다. 이것은 텍스처가로드되지 않은 경우가 아니며 텍스처가없는 셰이더를 사용할 때 화면이 여전히 흰색으로 변할 때처럼 내 객체가 사라지는 것입니다.

문맥을 수동으로 유지하는 방법을 찾지 못해 샘플 코드를 찾지 못했고이 문제가 잘 알려져 있고 문서화되어있는 동안 실제 솔루션에는 거의 코드가없는 것 같습니다.

내가 언급 한 하나의 경고 메시지가 장치를 회전 할 때 넥서스 4 GPU 드라이버보고합니다 glDrawArrays 내에서 이러한 두 가지 오류 (응용 프로그램의 각 재발로 변경)의 중() 화면이 회전 할 때마다 호출

<core_glHint:84>: GL_INVALID_ENUM 
<gl_draw_error_checks:575>: GL_INVALID_OPERATION 

이것은 내 정점 배열이 현재 컨텍스트에 대해 유효하지 않다고 가정하지만, 액티비티 내에서 onSurfaceCreated() 호출에서 정점 배열이 파괴되고 재구성된다는 것을 보장 할 수 있습니다. 가끔씩 회전 후 넥서스 7에

은 /는 오류와 함께 올 것이다 일시 :

call to OpenGL ES API with no current context 

것은 그래서 확실히 상황에 맞는 문제입니다.

나는 이것으로 머리카락을 꺼냅니다.

+0

활동과'GLSurfaceView' 사이에'onPause()'와'onResume()'을 연결 했습니까? –

+0

나는이 코드 세트를 붙여 넣은 저장소에 코드를 붙여 넣었습니다. 정확한 시간에 확실히 호출됩니다. –

+0

GLSurfaceView는 앱이 일시 중지되었을 때 명시 적으로 컨텍스트를 파괴합니다. http://developer.android.com/reference/android/opengl/GLSurfaceView.html#setPreserveEGLContextOnPause(boolean)로 우선 적용 해 볼 수는 있지만 일반적으로 모든 항목을 찢어서 일시 중지/다시 시작하면 다시 가져 오는 것이 더 쉽습니다. . – fadden

답변

0

코드에서 볼 수 있듯이 앱을 일시 중지하면 컨텍스트가 파기됩니다. 렌더러를 참조하십시오.파괴()

@Override 
public void onPause() { 
    super.onPause(); 

    if (renderer != null) { 
     glSurfaceView.onPause(); 
     renderer.Destroy(); // Deconstruct the native objects + gl textures 
    } 
} 

내가 그렇지 않으면 glSurfaceView가 파괴되는 렌더러에 대한 참조를해야하기 때문에, 그 호출을 제거하려고합니다.

+0

renderer.Destroy()는 NDK 종료를 처리하는 자체 메서드입니다. 컨텍스트를 변경하지 않습니다. –

+0

리소스가 사용자의 의견을보고 파괴됩니다. 그래서 당신은 무효이거나 자원을 사용하지 않을 것입니다. – user3747345

+0

OpenGL 자원이 파괴되었습니다. 그렇지 않습니까? GL 핸들이 컨텍스트간에 전송되지 않는다는 인상하에있었습니다. –