Trò chơi đa luồng - cập nhật, kết xuất và cách phân chia chúng


8

Từ bài đăng StackOverflow (tôi khuyên bạn nên di chuyển cái này):

Vì vậy, tôi đang làm việc trên một công cụ trò chơi và tôi đã đạt được tiến bộ khá tốt. Tuy nhiên, công cụ của tôi là một luồng đơn, và những lợi thế của việc tách cập nhật và kết xuất thành các luồng riêng biệt nghe có vẻ là một ý tưởng rất tốt.

Làm thế nào tôi nên làm điều này? Các công cụ trò chơi đơn luồng (về mặt khái niệm) rất dễ thực hiện, bạn có một vòng lặp nơi bạn cập nhật -> kết xuất -> ngủ -> lặp lại. Tuy nhiên, tôi không thể nghĩ ra một cách hay để ngắt cập nhật và hiển thị, đặc biệt là nếu tôi thay đổi tốc độ cập nhật của chúng (giả sử tôi đi qua vòng cập nhật 25 lần một giây và có 60fps để kết xuất) - nếu tôi bắt đầu cập nhật nửa chừng thông qua một vòng lặp render, hoặc ngược lại?


Câu trả lời:


6

Bạn sẽ muốn nhân đôi / nhân ba bộ đệm bất kỳ dữ liệu nào cần thiết để hiển thị bị thay đổi trong bản cập nhật. Bằng cách đó, bạn sẽ không được kết xuất với thứ gì đó đã được thay đổi một phần. Lý do có thể bạn sẽ cần gấp ba bộ đệm là cần 1) bản sao bạn đang cập nhật, 2) bản sao cuối cùng bạn đã cập nhật đầy đủ và 3) bản sao hiện đang được sử dụng để kết xuất mà bạn không muốn thay đổi .

Phần khó nhất có lẽ là tìm ra cách tốt nhất để sắp xếp dữ liệu của bạn cho việc này.


4

Trang web này thảo luận về vấn đề này và đã thực hiện một giải pháp bộ đệm ba như Roger đề xuất:

http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part1/ http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part2/ http: // blog. slapware.eu/game-engine/programming/multithreaded-renderloop-part3/ http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part4/

Thật khó để thực hiện, nhưng trang web có cả phân phối nguồn và nhị phân của việc triển khai nếu bạn quan tâm.

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.