簡體   English   中英

當鎖定屏幕或輸入背景時,OpenGL ES應用程序崩潰

[英]OpenGL ES application crashes when locked screen or entered background

我的應用程序是一個大量使用的OpenGL,它用於處理圖像,渲染場景,顯示預覽等。但是,在我實現多任務作為Apple的官方文檔“iOS的OpenGL ES編程指南”之后,仍然出現了奇怪的崩潰偶爾起來。 Debug Navigator Stack跟蹤顯示類似'sgxPatchDeferredFramebufferOffsets','presentRenderbuffer EXC_BAD_ACCESS','gpus_ReturnNotPermittedKillClient'等。

所以,我想知道究竟應該實現什么樣的OpenGL ES多任務。

=============更新:解決問題============

感謝您的回答,CStreel和其他試圖提供幫助的人。

在第二次“OpenGL ES編程指南”中閱讀“背景應用程序可能無法在圖形硬件上執行命令”部分后,我逐一了解這個問題。

我的應用程序的一個大問題是我不應該在通知方法中實現OpenGL ES多任務。 因為,與委托方法不同,通知方法將被異步調用,當應用程序已經移入后台時,這些停止動畫操作和glFinish()調用可能不會生效。 當我執行一系列與OpenGL ES相關的操作時,當我點擊鎖定屏幕按鈕時,這可能會更頻繁地發生。

如果你們發現了其他一些問題,請隨時與我聯系。

當您的應用程序即將進入后台時,如果您的應用程序調用任何OGLES功能,操作系統將立即終止您的應用程序

閱讀App States&Multitasking獲取更多信息閱讀成為負責任的背景應用程序

以下是該文檔的一些摘錄:

(Required) When moving to the background, make sure your app adjusts its behavior appropriately.

關於OGLES

 ...the app should stop calling OpenGL ES functions.

通知可以是同步的或異步的。 如果您注冊指定NSOperationQueue的通知,則回調將是異步的,否則我相信它將始終是同步的。

我遇到了一些崩潰,並在我的代碼中發現了一些錯誤:

  1. 盡管是“多線程”,共享的EAGLContext並不總是在使用它的所有線程上設置。 似乎每次離開RunLoop輸入應用程序代碼並發出任何openGL命令時,都必須在主線程上設置上下文。
  2. iOS 6在更改緩沖區時需要額外的“glFlush()”,這顯然是因為iOS 6中的錯誤.iOS 5和7未受影響。
  3. “DidEnterBackground”通知與其他代碼/線程之間缺乏同步,這意味着當其他線程仍在使用openGL時,通知應用程序狀態更改的主線程提前返回。 保持通知線程,直到完成調用openGL。 只有在允許返回后,iOS才會在openGL上啟動“監視程序”。

我使用DidEnterBackground / WillEnterForeground通知(而不是回調)來停止/重啟openGL操作。 我仍然得到一個非常罕見的崩潰(我必須使用自動化和鎖定/解鎖/旋轉20-30分鍾才能獲得它),但使用WillResignActive / DidBecomeActive沒有任何區別; 無論如何都會發生

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM