2011-12-05 3 views
0

onResume을 얻을 때 처음부터 EGL 및 GLES 상태를 다시 작성하지만 더 이상 아무것도 그릴 수없는 문제가 있습니다. 중요한 코드는 초기 작성 코드와 재개 코드간에 동일합니다. 나는 현재이 문제를 일으킬 수있는 것이 무엇인지 잘 모르겠다. 내 EGL 표면의 초기 생성 및 표시로 완벽하게 작동합니다. 앱이 다시 시작될 때만 (홈 버튼을 누른 다음 앱으로 돌아 가기) 아무 것도 표시하지 못합니다. 모든 것이 정상적으로 동작하고, 입력이 수신되고, 안드로이드 콜백이 정상적으로 발생했는지 확인했습니다 (dalvik 또는 렌더링 스레드에서 블로킹이나 락킹이 발생하지 않음). EGL 및 GLES 상태는 완전히 제거되고 onPause와 onResume 사이에서 다시 작성됩니다.GLES를 사용할 때 onResume 뒤에 빈 화면이 표시됩니다.

+0

좋아, 문제의 절반을 알아 냈습니다. 예를 들어, BadSuffers가 Bad Surface로 실패했습니다. eglCreateWindowSurface 함수가 성공하고 값이 eglSwapBuffers에 전달하는 값과 일치하므로 약간 혼란 스럽습니다. – Tomasu

+0

나는 100 % 확실하지는 않지만, GL 상태는 onPause와 onResume 사이에서 파괴되고 다시 만들어지기로되어 있다고 생각한다. 난 그냥 내 모든 버텍스 데이터, 비트 맵 등 정상적인 메모리에 물건을로드 할 때 (질감의 경우, 나는 그들을 모두 다시로드해야 onResume) –

+0

회신 주셔서 고마워, 상태가 있어야합니다. 완전히 재창조되었습니다. 제가하고있는 일입니다. 네가하는 일을 내가 훔쳐 갈 수 있다고 생각하지 않아? GLSurfaceView 클래스의 코드는 코드를 상당히 모호하게 만들 필요가없는 기능에 대해 많은 작업을한다는 점에서 약간 도움이되지 않습니다. 아마 어딘가에 내 코드의 버그 일 수도 있지만, 어제 볼 수있는 한, onPause와 onResume 사이에 GL 상태를 완전히 다시 작성하고 있습니다. – Tomasu

답변

2

내가하는 일은 앱 시작시 또는 필요할 때 모든 3D 모델 정점, 텍스처 등을 메모리 (GL 핸들이 아닌)에로드하는 것입니다.

OpenGL-es 1.1 (조명, 쉐이더, 입자 등 없음, 질감이있는 모델)로 작성된 비교적 간단한 게임 응용 프로그램을 가지고 있습니다. OpenGL 핸들에 미리로드 할 필요가있는 것은 텍스처로드 시간이 길어지기 때문입니다. 내가 아는

@override 
public void onPause(){ 

    findViewById(R.id.loading_screen).setVisibility(View.VISIBLE); 

} 

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

    findViewById(R.id.loading_screen).setVisibility(View.VISIBLE); 

    myRenderer.reLoadTextures(); 

    findViewById(R.id.loading_screen).setVisibility(View.GONE);  
} 

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

    findViewById(R.id.loading_screen).setVisibility(View.VISIBLE); 

    myRenderer.reLoadTextures(); 

    findViewById(R.id.loading_screen).setVisibility(View.GONE); 
} 

class MyRenderer implements Renderer{ 

    private HashMap<String,Texture> textures; 
    private boolean reloadTextures = false; 

    // flag to the renderer that textures need to be reloaded 
    public void reLoadTextures(){ 
     reloadTextures = true; 
    } 

    public void onDraw(GL10 gl){ 

     if(reloadTextures){ 

      // loop through hashmap and reload textures 
      Iterator it = textures.entrySet().iterator(); 
      while(it.hasNext()){ 
       Entry set = it.next(); 
       set.getValue().loadTexture(gl, set.getKey(), context); 
      } 

      reloadTextures = false; 
     } 

     // draw models as normal 

    } 

} 

이 ... 당신이 정말로 무엇을 찾고있어되지 않습니다 : 다른 모든

그래서 내 코드는 조금 다음과 같습니다 렌더러의 된 onDraw 방법 런타임에서 할 수 있습니다 에 대한. 이렇게하면 GL 상태가 파괴되는 것이 중요하지 않습니다. Android가 처음으로 앱을 시작하는 것처럼 자동으로 GL 상태를 제공합니다. 또한 SurfaceView를 확장 할 필요가 없다는 것을 의미합니다. 렌더러를 구현하기 만하면됩니다.

이것은 단순화 된 버전이며 스레딩을 고려하면 훨씬 더 복잡해집니다. 또한 Texture.loadTexture()에 약간의 작업이있어 ​​모델에서 사용하는 참조와 glGenTextures에서 얻은 ID가 앱/활동이 다시 시작된 후에도 일치하는지 확인해야합니다.

또한 매니페스트 파일에 android:screenOrientation="landscape"이있는 경우 내 전화, 홈 스크린 및 잠금 화면이 항상 세로로 표시되며 앱 재개시 방향 변경을 처리해야합니다. 방향이 틀립니다. onConfigurationChange()을 재정의하지 않으면 GLSurfaceView에 문제가 생길 수 있습니다 (일부 텍스처가 표시되지 않는 것처럼). 다시로드해도 이미지가 다시 표시됩니다. onResume

+0

답장을 보내 주셔서 감사합니다 :) 코드가 실제로 GLSurfaceView의 "모델"에서 onDraw 비트와 함께 작동하지 않기 때문에 GLSurfaceView를 사용하지 않습니다. 기본적으로 내 코드는 자체 입력 처리 및 렌더링을 수행하는 별도의 스레드에서 실행되는 일부 C 코드에서 GLES를 사용하여 SurfaceView를 묶습니다. 또한 현재 테스트 코드가 렌더링하는 것은 흰색 배경과 인식 된 각 터치에 대한 사각형입니다. 따라서 EGL과 GLES 자체를 제외하고는 복원 할 것이 없습니다. 그러나 그렇게 한 후에도 제대로 복원되기를 원하지 않습니다. – Tomasu

+0

아,저기서 도울 수 없어요. 미안합니다. –

+0

시도해 주셔서 감사합니다. 내 현재 계획에는 시간이있을 때 죽은 간단한 SurfaceView + EGL 데모 앱을 작성하고 작동하는지 확인하는 것입니다. 만약 그렇다면 (가능한) 현재 코드의 로직을 추가 할 때까지 추가해 보겠습니다. – Tomasu

관련 문제