2011-05-11 47 views
5

除非在按HOME鍵然後繼續的情況下,我的遊戲才能正常工作。需要做些什麼來再次使用紋理?我曾嘗試在GLSurfaceView上調用onPause和onResume(當調用activity的onPause和onResume時)。在簡歷中丟失Android中的OpenGL紋理

任何想法我可能做錯了什麼?

+0

你可以寫一些代碼示例嗎? – BadSkillz 2011-05-11 14:34:24

+1

@BadSkillz我不知道什麼代碼是相關的。我的活動/視圖和渲染器?我使用本機代碼加載紋理。需要做些什麼來恢復紋理?我需要從磁盤重新加載嗎? – 2011-05-11 14:44:33

回答

6

如果一切都失敗,重新加載紋理:

for tex in textures: 
    if glIsTexture(tex.opengl_name) == false: 
     glGenTextures(1, &tex.opengl_name) 

    glBindTexture(tex.texture_target); 
    glTexImage(..., texture.image); 
+0

我曾試過這個,但由於某種原因,紋理標識似乎混在一起(例如我的字體紋理應用在錯誤的地方)。我會堅持下去,再給它一個 – 2011-05-11 14:56:59

+0

謝謝,讓它工作。新生嬰兒缺乏睡眠導致了一些錯誤。清晰的頭,它效果不錯:) – 2011-05-12 11:35:55

4

即使你能解決問題,只給一點的解釋,可能幫助別人。

當活動暫停時,Android不保證OpenGL上下文保持活動狀態。

您必須重新創建簡歷上的每個OpenGL資源(紋理在您的情況下,還有VBO等)。

由於API 11,您可以在Android上保留ask kindly的上下文,但是沒有保證。

+0

我沒有重新加載紋理來解決問題。我只是犯了一個錯誤:) – 2012-02-07 11:46:06

+0

你怎麼知道OpenGL是否已經保存了它的上下文以節省不必要的重新加載? – 2014-03-06 12:13:52

+0

剛剛發現了關於getPreserveEGLContextOnPause()。如果這返回true,你保證保持上下文嗎? – 2014-03-06 12:35:12

2

想後:

  1. 不叫GLSurfaceView#的onPause /的onResume在活動的的onPause /的onResume
  2. 呼叫GLSurfaceView#的onPause /的onResume,還設置GLSurfaceView#setPreserveEGLContextOnPause(真)

這兩種情況都可以解決HOME-resume-black-texture問題。 猜測Android的實現在恢復時無法重新創建EGL上下文。由於onPause/onResume需要調用,因此應始終將setPreserveEGLContextOnPause設置爲true。