2011-11-09 16 views
3

我們有一個增強現實應用程序,可以在指向特定標記時顯示視頻或3D模型。這工作正常,但只要我們通過Back-Button退出MediaPlayer活動,OpenGL上下文似乎就會被破壞。該應用程序然後只是重新啓動,並需要重新加載所有資產,包括3D模型,導致我們想要防止的約10-15秒的延遲。 我已經閱讀了一些關於setPreserveEGLContextOnPause(true)並將它放入我們的GLSurfaceView(我們有一個3.x平板電腦),但它似乎沒有做任何事情(我是否需要實現其他的東西來使它工作?我幾乎找不到有用的文檔)。OpenGL上下文退出MediaPlayer後被破壞

我不知道我們的應用程序中的問題可能在哪裏,我想我們的GLSurface會被破壞,而我們不會注意到它。

我們從MediaPlayer的退出代碼是這樣的:

public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if ((keyCode == KeyEvent.KEYCODE_BACK)) {    
     this.finish(); 

     Intent intent = new Intent(MediaPlayerActivity.this, OpenGLActivity.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     this.startActivity(intent); 
    } 
    return super.onKeyDown(keyCode, event); 
} 

任何提示我們如何能保護OpenGL上下文,或者退出MediaPlayer的沒有詆譭我們的主要活動?

+1

您是否檢查過您的設備實際支持多少個單獨的GL上下文? pro-tip是爲'onKeyDown(int,KeyEvent)'創建兩個新的測試活動和轉換,一個根本不使用GL,一個顯示簡單的'GLSurfaceView'。媒體播放器可能需要自己的GL上下文,迫使平板電腦回收您的內容。 – Jens

+1

因此,我嘗試調用一個顯示簡單的Toast()(而不是媒體播放器)並返回GL活動的測試活動。同樣的結果,GL上下文消失了。我注意到他似乎正確調用了GL-activity的onCreate()*和* onResume()*,但無法調用SurfaceView的* onResume()*,因爲它爲null。 – Lennart

+1

並非所有活動都是從這種情況下重新創建的?一旦onCreate被調用,你應該重新創建你的Views。你可以做的是回收你的Renderer,例如,使用'Activity.onRetainNonConfigurationInstance()'並在onCreate()中重新使用它,如果它被發現的話。在那裏你至少可以存儲你的模型,以防止重新加載它。 – harism

回答

1

爲了解決這個問題,我們將MediaPlayer放置在SurfaceView圖層上,該圖層將顯示在我們的OpenGL內容上。根據標記,我們只顯示或隱藏圖層並防止切換出上下文。