2011-04-21 71 views
2

我有一個應用程序,其主要活動顯示GLSurfaceView。每次有新的活動啓動時間,比方說設置活動,OpenGl的表面被破壞,並創建一個新的,當用戶返回到主活動。如何防止GLSurfaceView頻繁重現OpenGL的表面(Android上的)?

這是很慢的,因爲我每次都需要重新生成的紋理,使他們可以綁定到新的表面。 (緩存紋理是可能的,但它是我的第二選擇,因爲內存有限。)

是否有辦法防止被重新每一次面?


我自己的分析,通過觀察the code是:

有兩個觸發器的表面被破壞:

  1. GLSurfaceView.onPause()由活動
  2. 的觀點被分離稱爲從窗口

有啓動新活動時防止#2發生的一種方法?

回答

3

如果你的目標3.0或更高版本,看看GLSurfaceView.setPreserveEGLContextOnPause()。請記住,設備可能仍然僅支持一個OpenGL上下文的時間,所以,如果你切換到使用OpenGL和回你的另一個活動,你會無論如何都要重新上傳 - 所以我建議保持高速緩存和丟棄當你的活動的onLowMemory()被調用。

+0

我瞄準2.1,所以你的答案證明了它是不可能在我的情況。 – HRJ 2011-04-25 04:59:02

1

簡短的回答:沒有

龍答: 您可以緩存/保存所有的紋理,當你在onPause(),並在恢復的onResume他們()。但除此之外,機器人活動的生命週期要求的觀點,必須從頭開始的onResume()恢復

From activity cycle

如果活動暫停或停止時,系統可以從存儲器通過任一下降的活性,要求它完成,或者乾脆殺死它的進程。當它再次顯示給用戶時,它必須完全重新啓動並恢復到以前的狀態。

一種方法來解決它的想法是,如果你是在你自己的應用程序,而不是開始一個新的活動,創建一個覆蓋/對話框在當前活動,並把SettingsView在那裏。

+0

什麼是推出SettingsView(一般)標準/推薦的方法是什麼?覆蓋/對話框/活動?假設他們是標準慣例,我一直使用活動。 – HRJ 2011-04-21 08:48:22

+0

「標準」被假設是一個設置活動。但對於這樣的情況,有兩種設置是有意義的。 1.一種預運行設置(例如,用於難度/對象紋理) 2.一種在設置(例如音樂的音量,背景顏色) – 2011-04-21 10:52:58

2

緩存紋理是可能的,通過 這將是我的第二選擇,因爲內存

如果有很多紋理的有限 ,唯一的解決辦法是AFAIK緩存它們,在重新啓動活動時無法保持曲面和紋理的存在。順便說一句,你可以在本地代碼中使用比Java中更多的內存。

在android-ndk上有關於此的long discussion。特別是,我發佈了一些benchmarks,這表明位圖解碼可能花費高達紋理加載時間的85%,texImage2D僅佔剩餘的15%。因此,緩存解碼圖像數據很可能是一個很好的性能增強器,通過將其與內存映射文件(mmap)結合使用,甚至可以緩存大量的圖像數據,同時保持內存友好。

+0

以我的情況下,在Java運行時創建的紋理。我想是時候讓自己沉浸在本地代碼中了。感謝您的鏈接。 – HRJ 2011-04-21 11:29:53

相關問題