2010-10-14 30 views
11

Tôi biết rằng việc chia sẻ một ngữ cảnh giữa các luồng là tin xấu. Tôi biết rằng tôi có thể an toàn tạo và sử dụng một bối cảnh với một framebuffer offscreen trên một sợi thứ cấp khi không có gì xảy ra với GL trên sợi chính.OpenGL có an toàn cho nhiều luồng với các ngữ cảnh riêng biệt không?

Tôi chưa thể tìm được câu trả lời cuối cùng cho câu hỏi liệu tôi có thể tạo hai bối cảnh trên hai chủ đề khác nhau một cách an toàn hay không (ví dụ: vẽ chủ đề chính trên màn hình)) và có cả hai thực hiện cuộc gọi hàm GL cùng một lúc.

Nói cách khác, miễn là ngữ cảnh khác nhau, có thể hai chuỗi "chia sẻ" API C và do đó là GPU? Hay đó vốn là cái gì đó không thể lay chuyển được? Hay điều này có thực hiện cụ thể không?

Hỏi cụ thể cho OpenGL ES trên iOS, nhưng đó có thể là câu hỏi chung về GL.

+0

Liên quan: [Tôi có nên sử dụng nhiều chủ đề trong trò chơi OpenGL ES của mình không?] (Http://stackoverflow.com/questions/5246189/should-i-use-multiple-threads-within-my-opengl-es-game) – bobobobo

Trả lời

9

Có, bạn cần sử dụng một ngữ cảnh cho mỗi chuỗi bạn muốn sử dụng OpenGL, bạn cũng có thể chia sẻ các đối tượng giữa các ngữ cảnh. Đây là cách để đi :)

+5

Không hoàn toàn chính xác: Bạn không cần một ngữ cảnh cho mỗi chuỗi, bạn có thể sử dụng cùng một ngữ cảnh trong nhiều hơn một chuỗi, miễn là bạn không bao giờ làm như vậy cùng một lúc, ví dụ: bằng cách khóa tất cả quyền truy cập vào ngữ cảnh và miễn là khóa này bao gồm một hàng rào bộ nhớ trên các hệ thống cần một (thường là trường hợp khóa). – Mecki

+0

@Mecki Bạn có thể cung cấp một tham chiếu đến khái niệm đó không? Sử dụng một bối cảnh gl __any__ gọi hàm gl? Ví dụ, tôi có thể tạo một đối tượng Texture mới/gọi 'glTexImage2D' trên một bối cảnh gl trong khi đồng thời vẽ từ cùng một bối cảnh gl trên một luồng khác không? – bobobobo

+0

@bobobobo Có, bất kỳ lời gọi hàm gl * nào cũng sử dụng bối cảnh hiện tại được đặt cho luồng; nếu không thì người ta sẽ phải nuôi ngữ cảnh mong muốn cho mọi hàm gl. Trong OpenGL trước đây sẽ chỉ hỗ trợ một ngữ cảnh cho mỗi quá trình, do các bối cảnh kết quả đã được tạo thành một chuỗi cụ thể và được ngầm định đặt cho một chuỗi ngày hôm nay. Và không, bạn không thể sử dụng cùng một ngữ cảnh trên hai luồng cùng một lúc. Một ngữ cảnh chỉ có thể được sử dụng bởi một luồng bất kỳ lúc nào. Bạn chỉ có thể chuyển đổi luồng mà bối cảnh bị ràng buộc. – Mecki

1

Tùy chọn 1: Nếu bạn không sử dụng ngữ cảnh theo hai luồng cùng lúc, một ngữ cảnh là đủ.

Tùy chọn 2: Nếu bạn cần sử dụng OpenGL theo nhiều luồng cùng một lúc, bạn cần nhiều hơn một ngữ cảnh. Sau đó, nếu bối cảnh chia sẻ Chia sẻ nhóm của họ, họ chia sẻ nội dung OpenGL của họ như kết cấu. Bằng cách này, bạn có thể tải các kết cấu hoặc xử lý framebuffer nặng trên một chủ đề nền.

Hãy nhìn vào phần cuối cùng về Sharegroups đây: http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithOpenGLESContexts/WorkingwithOpenGLESContexts.html

Lựa chọn 3: GLKit cung cấp một số xử lý nền built-in, ví dụ tải kết cấu không đồng bộ qua GLKTextureLoader s - textureWithContentsOfFile. Tôi không biết tất cả các tùy chọn, nhưng nó chắc chắn đơn giản hóa một số trường hợp sử dụng OpenGL không đồng bộ.

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