2012-10-17 42 views
5

Ứng dụng của tôi là một ứng dụng OpenGL được sử dụng để xử lý hình ảnh, hiển thị cảnh, hiển thị xem trước, v.v. Tuy nhiên, sau khi triển khai nhiều tác vụ dưới dạng tài liệu chính thức của Apple 'Hướng dẫn lập trình OpenGL ES cho iOS', các sự cố lạ thường vẫn xuất hiện một cách không thường xuyên. Theo dõi ngăn xếp của trình theo dõi lỗi cho thấy một cái gì đó như 'sgxPatchDeferredFramebufferOffsets', 'presentRenderbuffer EXC_BAD_ACCESS', 'gpus_ReturnNotPermittedKillClient', v.v.Ứng dụng OpenGL ES bị treo khi màn hình khóa hoặc hình nền được nhập

Vì vậy, tôi muốn biết chính xác ai nên triển khai OpenGL ES Multi-task.

============= UPDATE: vấn đề giải quyết ============

Cám ơn câu trả lời của bạn, CStreel, và chàng trai khác, những người cố gắng giúp đỡ.

Sau khi đọc 'Các ứng dụng nền có thể không thực thi lệnh trên phần cứng đồ họa' trong phần 'Hướng dẫn lập trình ESO' cho iOS 'lần thứ hai, từng dòng, tôi có một sự hiểu biết mới với vấn đề này.

Vấn đề lớn với ứng dụng của tôi là tôi không nên triển khai nhiều tác vụ OpenGL ES trong phương thức thông báo. Vì, không giống như các phương thức ủy nhiệm, các phương thức thông báo sẽ được gọi là không đồng bộ, các hành động dừng hoạt động và các cuộc gọi glFinish() có thể không có hiệu lực khi ứng dụng đã chuyển sang nền. Điều này có thể xảy ra thường xuyên hơn khi tôi nhấn nút khóa màn hình ngay sau khi tôi thực hiện một loạt các hành động liên quan đến OpenGL ES.

Nếu các bạn tìm thấy một số vấn đề khác, vui lòng liên hệ với tôi.

+0

Sự cố vẫn tiếp diễn nếu bạn gọi OpenGL ES từ hàng đợi nối tiếp ở chế độ nền. Ngay cả sau khi nói với bộ hẹn giờ ngừng bắn, một khối vẫn tiếp tục hoàn thành và nó có thể gây ra sự cố. http://stackoverflow.com/questions/19215554/how-to-stop-opengl-drawing-when-calling-opengl-from-background – openfrog

Trả lời

4

Khi bạn ứng dụng là sắp bước vào nền, nếu ứng dụng của bạn gọi bất kỳ OGLES chức năng hệ điều hành sẽ giết ứng dụng của bạn ngay lập tức

Đọc App States & Multitasking để biết thêm thông tin Đọc Being a Responsible Background App

Dưới đây là một số chiết xuất từ ​​tài liệu đó:

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

Liên quan đến OGLES

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

Tôi đã triển khai các đại biểu này cũng như thông báo. Khi ứng dụng từ chức trạng thái hoạt động, tôi đã dừng chụp phiên và hoạt ảnh. Tôi đã cố gắng gọi glfinish() trong hàng đợi công văn xử lý sau khi từ chức thông báo hoạt động đã nhận được, nhưng nó đã không giúp đỡ. – cocoatoast

0

Thông báo có thể đồng bộ hoặc không đồng bộ. Nếu bạn đăng ký thông báo chỉ định NSOperationQueue, cuộc gọi lại sẽ không đồng bộ, nếu không tôi tin rằng nó sẽ luôn đồng bộ.

tôi đã có một vài trong số những tai nạn và tìm thấy một vài lỗi trong mã của tôi:

  1. Các chia sẻ EAGLContext, dù đã được "đa luồng" không luôn đặt trên tất cả các chủ đề sử dụng nó. Dường như bạn phải đặt đặt ngữ cảnh trên chuỗi chính mỗi lần rời khỏi RunLoop để nhập mã ứng dụng của bạn và phát hành bất kỳ lệnh openGL nào.
  2. iOS 6 cần thêm "glFlush()" khi thay đổi bộ đệm, do dường như là lỗi trong iOS 6. iOS 5 và 7 không bị ảnh hưởng.
  3. Thiếu đồng bộ hóa giữa thông báo "DidEnterBackground" và các mã/chủ đề khác, có nghĩa là chuỗi chính, thông báo thay đổi trạng thái ứng dụng đã trở lại sớm, khi các chủ đề khác vẫn đang sử dụng OpenGL.Giữ chuỗi thông báo cho đến khi bạn kết thúc việc gọi OpenGL. Chỉ sau khi được phép trả lại, iOS bắt đầu "cơ quan giám sát" trên OpenGL.

Tôi sử dụng thông báo DidEnterBackground/WillEnterForeground (không gọi lại) để dừng/khởi động lại các hoạt động OpenGL. Tôi vẫn nhận được một vụ tai nạn rất hiếm (tôi phải sử dụng tự động hóa và khóa/mở khóa/xoay trong 20-30 phút trước khi nhận được nó), nhưng sử dụng WillResignActive/DidBecomeActive làm cho không có sự khác biệt; chúng xảy ra bất kể.

Các vấn đề liên quan