2014-03-05 6 views
3

우리 게임에서는 작은 이미지에서 여러 개의 큰 텍스처가 동적으로 생성되어야하며 텍스처의 데이터 복사본을 유지하지 않아도됩니다. OpenGL을 사용하여 glTexSubImage2d 실제 텍스처.안드로이드에서 컨텍스트를 잃을 때 OpenGL 텍스처를 저장하는 방법

Back을 누르거나 게임에서 포커스가 사라지면이 텍스처를 RAM에 저장하려고합니다. 따라서 사용자가 다시 게임으로 돌아 간다면 onSurfaceCreated에서 다시 만들거나 다시로드 할 수 있습니다. 우리는 이미 모든 정적 텍스처를 '디스크'에서 다시로드합니다.

그러나 EGL 컨텍스트를 잃을 것이라는 메시지를 어디에서 얻을 수 있는지 알기가 어렵습니다. 메인 액티비티의 onBackPressed에 플래그를 설정하면 기본 렌더 루프에서 해당 플래그를 검사하여 텍스처를 저장할 수 있지만 기본 액티비티의 텍스처에 액세스 할 수 없으므로 기본 액티비티의 onStop 콜백 너무 늦었다. 텍스쳐를 저장하는 후속 렌더링 루프는 없습니다. 뒤로 버튼을 누르는 것 이외의 다른 방법으로 onStop이 호출되므로이 작업을 수행해야합니다.

아마도 onStop을 지연시켜 둘 중 하나를 "렌더링"할 수 없습니다. 다른 아이디어?

+0

FBO에 텍스처 바인딩을 시도한 다음 glReadPixels을 호출하여 텍스처 데이터를 메모리에 복사 해 보셨습니까? – Mortennobel

+0

네, 텍스처에서 데이터를 얻는 방법은 정확히 같지만 문제는 이것을 언제해야 하는지를 아는 것입니다. 렌더링 스레드에서 EGL 컨텍스트를 잃기 직전에이 작업을 수행해야합니다. – user3162134

답변

1

응용 프로그램의 콜드 스타트 ​​중에이 텍스처를 동적으로 생성 했으므로이 텍스처 dirty을 부분적으로 분할하고 응용 프로그램이 감기 시작한 것처럼 다시 생성하는 것이 좋습니다.

이러한 텍스처를 저장하려면 onStop()이 호출 될 때까지 기다리지 마십시오. 일단 당신이 그들의 내용을 생성하면 그들을 저장하십시오.

+0

새로운 애니메이션이로드 될 때 새로운 그래픽이 지속적으로 업데이트되고 추가로 메모리를 차지하므로 "메모리 버퍼에 데이터를 복사하고 gl 텍스처를 해제하여 방금 가져온 메모리를 가져 오는 것이 좋습니다" 할당 된. 그런 다음 다시 업로드하십시오. 우리는 주기적으로이 작업을 수행 할 수는 있지만 시간이 오래 걸리며 항상 조금 뒤떨어져 있습니다. – user3162134

+0

@ user3162134 : 처음에는 '더러운'이라고 표시 하시겠습니까? –

+0

작은 세그먼트로 다시로드하여 대부분의 텍스처를 재구성 할 수 있지만 일부 다른 부분은 다시 만들기가 매우 어렵습니다. 스냅 샷은 많은 작은 부분들로 만들어 졌는데, 이것은 10 초를 더한 시간이 걸립니다. 따라서 완벽한 텍스쳐 상태를 보존하고 싶습니다. – user3162134

0

스레드 동기화 문제로 들립니다. 버튼 누름 이벤트 또는 onPause 이벤트 (다른 ​​앱이 앞쪽으로 갈 경우)는 메인 (UI) 스레드에서 실행되는 반면, OpenGL 렌더링은 자체 스레드를 가지고 있습니다. UI 스레드의 이벤트가 트리거되면 플래그를 설정하고 condition_variable을 기다립니다. 렌더 스레드는 항상 플래그를 검사하고 설정되면 텍스처를 저장하고 condition_variable의 조건을 변경하고 UI 스레드에 알립니다.