2013-04-16 64 views
3

我有一個GLSurfaceView渲染器和方法onSurfaceCreated只被調用一次(基本上只有當活動被創建或重新創建時)。GLSurfaceView渲染器,如何強制曲面重新創建?

我需要在正常活動生命週期中EGL上下文丟失和表面重新創建時測試行爲,但是無論我做什麼,我都無法將應用程序置於這種情況下。

有什麼我可以做的,以模擬onSurfaceCreated再次調用的情況嗎?如何讓我的應用程序失去EGL上下文?

編輯:幾天後,我發現這個問題消失了,應用程序啓動時正確的行爲作爲規範說:

public abstract void onSurfaceCreated (GL10 gl, EGLConfig config) 
Called when the surface is created or recreated. 
Called when the rendering thread starts and whenever the EGL context is lost. 
The EGL context will typically be lost when the Android device awakes 
after going to sleep 

在此之前,所有的設備去的時間睡覺,活動被破壞並在清醒時重新創建,這阻止了我測試OnSurfaceCreated中的代碼是否運行良好。

現在它在睡眠/清醒時表現得更好 - 它通常不會破壞活動,只是調用OnSurfaceCreated方法,這是我所瞄準的情況。

+0

我唯一能想到的就是通過查看佈局機制來改變GLSurfaceView的大小,並看看會發生什麼。 – harism

回答

2

根據文檔,GLSurfaceView.Renderer.onSurfaceCreated在創建或重新創建曲面時調用。

當渲染線程啓動並且每當EGL上下文丟失時調用。 當Android設備在睡覺後醒來時,EGL上下文通常會丟失。

你試過鎖定你的設備的屏幕並解鎖它嗎?

+0

非常感謝您的努力。看起來這些文檔對於這種情況是非常正確的,在發佈問題之前我已經嘗試過了。然而,我的應用程序行爲奇怪,如我更新的問題中所述。既然你已經回答了這個問題,我接受你的答案。 – Dusan

2

我不確定,但我能想到的唯一的事情就是將GLSUrfaceView換成新的,使用相同的GLSurfaceView.Renderer。 這應該創建一個新的EGL上下文,並再次調用onSurfaceCreated()

+0

你可以添加一些示例代碼嗎? – gonephishing

1

也許你可以看看onScreenStateChanged方法,但它可用於API 16或更高版本。如果您的意思是「暫停和恢復活動」,則可以使用或onResume來跟蹤此情況。

你想要做什麼onSurfaceCreated()?您可以通過SurfaceViewrequestRender()方法迫使渲染,並做必要的計算內onDrawFrame()GLSurfaceView.Renderer

+0

謝謝你的回答。在OnSurfaceCreated中,我正在加載和重新加載紋理和硬件頂點緩衝區。本質上,一個簡單的代碼,但我需要在現實世界的情況下進行測試。 但是,問題已解決,您可以在我更新的答案中查看詳細信息。 – Dusan

0

如果你的觀點是在一個片段,您可以分離和重新連接片段。

相關問題