2012-10-17 43 views
5

我的應用程序是一個重要的OpenGL,用於處理圖像,渲染場景,顯示預覽等。然而,在我將多任務實現爲Apple的官方文檔「適用於iOS的OpenGL ES編程指南」,奇怪的崩潰仍然偶爾出現。調試導航堆棧跟蹤顯示類似「sgxPatchDeferredFramebufferOffsets」,「presentRenderbuffer EXC_BAD_ACCESS」,「gpus_ReturnNotPermittedKillClient」等OpenGL ES應用程序在鎖定屏幕或進入背景時崩潰

所以,我想知道究竟應該實行OpenGL ES的多任務。

============= UPDATE:問題就迎刃而解了============

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

在閱讀'後臺應用程序不能執行圖形硬件上的命令'部分'iOS的OpenGL ES編程指南'後,我一直一行一行地對這個問題有了新的認識。

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

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

+0

如果您從後臺的串行隊列中調用OpenGL ES,問題仍然存在。即使在告訴定時器停止射擊之後,一個塊仍然會完成並且可能導致崩潰。 http://stackoverflow.com/questions/19215554/how-to-stop-opengl-drawing-when-calling-opengl-from-background – openfrog

回答

4

當你的應用程序即將進入的背景下,如果你的應用程序調用的任何OGLES功能OS會殺了你的應用程序馬上

閱讀App States & Multitasking更多信息 閱讀Being a Responsible Background App

這裏有一些從文件中提取:

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

在問候OGLES

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

我已經實現了這些代表以及通知。當應用程序退出活動狀態時,我停止捕捉會話和動畫。在收到活動通知後,我試圖在處理調度隊列中調用glfinish(),但它沒有幫助。 – cocoatoast

0

通知可以是同步的或異步的。如果您註冊指定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並沒有什麼區別;他們無論如何。

相關問題