Làm cách nào để sử dụng ứng dụng OpenGL đa luồng để cập nhật VBO và sử dụng chúng cùng một lúc?


11

Tôi có một ứng dụng đơn giản. Nó có hai luồng, mỗi luồng có bối cảnh kết xuất riêng, nhưng chúng chia sẻ một VBO (điều này đang hoạt động, tôi đã thử nghiệm nó).

Bây giờ tôi muốn: Một luồng đang hiển thị một số dữ liệu từ nửa đầu của VBO và luồng thứ hai đang cập nhật phần thứ hai của VBO.

Khi tôi không cập nhật VBO, nó hoạt động tốt.

Nhưng tôi có một số vấn đề kỳ lạ khi cập nhật. Khi tôi sử dụng glMapBufferđể cập nhật VBO (trong luồng thứ hai), trong luồng đầu tiên, hầu hết thời gian, nó sẽ không hiển thị gì cả. Toàn bộ màn hình rõ ràng (sau một glClearcuộc gọi). Có vẻ như nó không thể chạm vào dữ liệu từ VBO (điều này có thể hiểu được, bởi vì toàn bộ bộ đệm được ánh xạ và do đó nó có thể bị khóa bằng cách nào đó).

Tôi đã thử sử dụng glMapBufferRange, trong đó sử dụng GL_MAP_UNSYNCHRONIZED_BIT. Điều này có nghĩa là, "đừng chờ đợi và sử dụng VBO như bạn muốn, tôi (chương trình) sẽ tự đồng bộ hóa nó". Ngoài ra, khi tôi ánh xạ một loạt VBO và kết xuất dữ liệu từ một phần khác, điều đó không nên chờ đợi, nhưng tôi đang gặp vấn đề tương tự như tôi glMapBuffer.

Ai có thể giúp tôi khắc phục điều này hoặc giải thích tại sao nó xảy ra?

Câu trả lời:


6

Nếu ai đó quan tâm đến vấn đề này, bạn có thể tìm giải pháp trên diễn đàn OpenGL . Về cơ bản, bộ đệm không thể được truy cập bởi hai chủ đề hoặc bối cảnh đồng thời, không phải để đọc hay viết. Do đó, một cơ chế khóa như std::mutexlà cần thiết.


Cảm ơn đã chỉ vào giải pháp. Tôi chỉnh sửa câu trả lời của bạn để tóm tắt nó.
danijar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.