Họ suggest:Tại sao Apple đề xuất gửi các lệnh OpenGL trong hàng đợi nền nối tiếp khi điều này chắc chắn dẫn đến sự cố?
Khi sử dụng GCD, sử dụng một hàng đợi nối tiếp chuyên dụng để gửi lệnh để OpenGL ES; điều này có thể được sử dụng để thay thế mô hình mutex thông thường.
Tôi không hiểu đề xuất này. Có xung đột mà tôi không thể giải quyết:
Khi ứng dụng ủy nhiệm ứng dụng nhận được cuộc gọi -applicationWillResignActive
, điện thoại phải ngay lập tức ngừng gọi bất kỳ chức năng OpenGL nào.
Nếu ứng dụng tiếp tục gọi hàm OpenGL sau khi -applicationWillResignActive
trả về, ứng dụng sẽ gặp sự cố.
Nếu tôi làm theo khuyến cáo của Apple để gọi chức năng OpenGL trong một hàng đợi nền sê-ri, tôi đang phải đối mặt với vấn đề dường như không thể giải quyết này:
1) Sau khi tôi nhận -applicationWillResignActive
tôi phải ngay ngừng kêu gọi bất kỳ chức năng OpenGL thêm.
2) Nhưng vì hàng đợi nối tiếp đang ở giữa xử lý một khối mã trong nền, đôi khi khối mã sẽ hoàn thành việc thực hiện after
-applicationWillResignActive
trả về và ứng dụng gặp sự cố.
Dưới đây là hình minh họa cho thấy "các khối" đồng thời. Các chủ đề chính nhận được một tin nhắn dừng lại đầy đủ và phải ngăn chặn các cuộc gọi hơn nữa để OpenGL ES. Nhưng tiếc là những xảy ra trong một hàng đợi nền mà không thể dừng lại trong chuyến bay của làm việc trên một khối:
|_____main thread: "STOP calling OpenGL ES!"_____|
_____|_____drawing queue: "Draw!"_____|_____drawing queue: "Draw!"_____|
Về mặt kỹ thuật tôi thấy không có cách nào để ngăn chặn hàng đợi nền ngay lập tức và tránh các cuộc gọi hơn nữa để OpenGL ở chế độ nền. Một khối mã đã gửi một lần chạy tiếp tục chạy.
Giải pháp duy nhất tôi tìm thấy là NOT gọi hàm OpenGL ES ở chế độ nền. Thay vào đó, hãy gọi chúng trên chuỗi chính để đảm bảo rằng chúng sẽ không bao giờ được gọi sau khi ứng dụng mất quyền truy cập vào GPU.
Vì vậy nếu nó không quan trọng để gọi chức năng OpenGL ES ở chế độ nền, cách nào bạn đảm bảo rằng họ không bao giờ được gọi sau khi ứng dụng từ chức đang hoạt động?
Nhóm công việc có khiến nguyên tắc chính phải đợi cho đến khi khối enqueued hoàn thành thực thi không? Có một liên kết hữu ích/ví dụ như thế nào điều này được thực hiện? – openfrog