Nói chung, không thể thực hiện "bản đồ không chặn", nhưng bạn có thể ánh xạ mà không bị chặn.
Lý do tại sao có thể không có "bản đồ không chặn" là thời điểm cuộc gọi hàm trả về, bạn có thể truy cập dữ liệu, vì vậy người lái xe phải đảm bảo dữ liệu ở đó, tích cực. Nếu dữ liệu chưa được chuyển, người lái xe khác có thể làm gì nhưng chặn.
Chủ đề không làm điều này tốt hơn, và có thể làm cho nó tồi tệ hơn (thêm đồng bộ hóa và các vấn đề chia sẻ ngữ cảnh). Chủ đề không thể loại bỏ nhu cầu truyền dữ liệu một cách kỳ diệu.
Và điều này dẫn đến cách không chặn lập bản đồ: Chỉ bản đồ khi bạn chắc chắn rằng quá trình chuyển hoàn tất. Một cách an toàn để làm điều này là ánh xạ bộ đệm sau khi lật bộ đệm hoặc sau glFinish
hoặc sau khi chờ đợi đối tượng truy vấn/hàng rào. Sử dụng một hàng rào là cách thích hợp hơn nếu bạn không thể đợi cho đến khi bộ đệm được đổi chỗ. Một hàng rào sẽ không ngăn chặn đường ống, nhưng sẽ cho bạn biết việc chuyển nhượng của bạn có được thực hiện hay không (glFinish
có thể có hoặc không, nhưng sẽ có thể là gian hàng). Đọc sau khi trao đổi bộ đệm cũng là 100% an toàn, nhưng có thể không chấp nhận được nếu bạn cần dữ liệu trong cùng một khung (hoạt động hoàn hảo cho ảnh chụp màn hình hoặc để tính toán biểu đồ cho tonemapping).
Cách an toàn hơn là chèn "một số nội dung khác" và hy vọng rằng trong thời gian đó quá trình chuyển đã hoàn tất.
Đối với các bình luận dưới đây:
Câu trả lời này là
không không chính xác. Nó không thể làm bất kỳ tốt hơn so với dữ liệu truy cập sau khi nó có sẵn (điều này nên được rõ ràng). Điều này có nghĩa là bạn
phải đồng bộ/chặn, cách này hay cách khác, không có lựa chọn nào khác.
Mặc dù, từ một điểm rất pedantic của xem, bạn có thể sử dụng tất nhiên
GL_MAP_UNSYNCHRONIZED_BIT
để có được một chặn không hoạt động bản đồ, điều này là hoàn toàn không thích hợp, vì nó không hoạt động trừ khi bạn
rõ ràng tái tạo
ngầm đồng bộ như mô tả ở trên. Một ánh xạ mà bạn không thể truy cập một cách an toàn là tốt cho không có gì.
Lập bản đồ và truy cập bộ đệm mà OpenGL đang chuyển dữ liệu sang mà không đồng bộ hóa/chặn (ngầm hoặc rõ ràng) có nghĩa là "hành vi không xác định", chỉ là một từ ngữ đẹp hơn cho "kết quả có thể là rác".
Nếu, mặt khác, bạn đồng bộ hóa một cách rõ ràng (với hàng rào như mô tả ở trên), thì không liên quan đến việc bạn có sử dụng cờ không đồng bộ hay không, vì không cần đồng bộ ngầm hơn nữa.
Bạn có thể giải thích thêm một chút về "đối tượng truy vấn" này không? Âm thanh như tôi có thể sử dụng để trì hoãn cuộc gọi đến bản đồ nếu nó chưa sẵn sàng. – ronag
Điều đó đề cập đến [ARB_sync] (http://www.opengl.org/registry/specs/ARB/sync.txt) cũng nằm trong lõi 3.2. Điều này cho phép bạn chèn các truy vấn đồng bộ hóa ("hàng rào") vào dòng lệnh, bạn có thể đợi (máy khách hoặc máy khách + máy chủ) hoặc truy vấn trạng thái hoàn thành. Nếu truy vấn đồng bộ trả về rằng nó được thực hiện, nó có nghĩa là tất cả các lệnh đã xảy ra trước khi bạn chèn hàng rào đã hoàn thành. Vì vậy, trong trường hợp của bạn, bạn biết rằng dữ liệu là nơi bạn muốn nó, và lập bản đồ bộ đệm sẽ không chặn. – Damon
Tuyệt vời, vì vậy nếu tôi hiểu điều này một cách chính xác, tôi nên đặt một truy vấn đồng bộ hóa ngay sau khi cuộc gọi của tôi đến glReadPixels (thiết bị-> chuyển host). Khi tôi biết rằng truy vấn đã sẵn sàng, thì cuộc gọi tới bản đồ sẽ không chặn (hoặc chỉ rất ngắn)? – ronag