Phát hiện va chạm XNA 2D mà không có GetData ()


7

Tôi hiện đang làm việc trên một trò chơi Worms liên quan đến biến dạng địa hình. Tôi đã từng làm điều đó với .GetData(), sửa đổi mảng màu, sau đó sử dụng .SetData(), nhưng tôi đã xem xét việc thay đổi nó để thực hiện công việc trên GPU thay vào đó (sử dụng RenderTarget).

Tất cả đang diễn ra tốt đẹp với điều đó, nhưng tôi đã đi vào một vấn đề khác. Toàn bộ phát hiện va chạm của tôi đối với địa hình được dựa trên một mảng Màu đại diện cho địa hình, nhưng tôi không còn mảng màu đó nữa. Tôi có thể sử dụng .GetData()mỗi khi tôi sửa đổi địa hình để cập nhật mảng Màu của mình, nhưng điều đó sẽ đánh bại mục đích thay đổi ban đầu của tôi.

Những gì tôi sẽ ổn với việc sử dụng .GetData()một lần vào lúc đầu, và sau đó sửa đổi mảng đó dựa trên những thay đổi tôi thực hiện cho địa hình sau này bằng một số phương tiện khác. Tôi không biết làm thế nào tôi sẽ làm điều này mặc dù, bất cứ ai có thể giúp đỡ?

Câu trả lời:


3

Tôi đã thực hiện một chút nghiên cứu và tôi vẫn chưa tìm được giải pháp để loại bỏ bất kỳ cuộc gọi GetData nào mỗi khi địa hình của tôi bị thay đổi, nhưng tôi đã tìm ra cách để "tối ưu hóa" nó, hoặc ít nhất là giảm các cuộc gọi GetData như nhiều nhất có thể.

  • Bản vẽ miệng núi lửa được bó lại, nghĩa là thay vì vẽ từng cái như nó đã tạo, tôi thêm chúng vào danh sách và vẽ tất cả chúng trong mỗi vài khung hình. Điều này làm giảm số lượng cuộc gọi GetData - một cuộc gọi cho mỗi đợt miệng hố chứ không phải cuộc gọi trên mỗi miệng hố.

  • Sau khi vẽ các miệng hố đến mục tiêu kết xuất, tôi đợi một vài khung hình trước khi gọi GetData để đảm bảo GPU đã xử lý tất cả các lệnh vẽ. Điều này giảm thiểu các quầy hàng đường ống.

  • Nếu tôi có một cuộc gọi GetData đang chờ xử lý để thực hiện và có thêm nhiều miệng hố, các miệng hố sẽ được giữ nguyên cho đến khi cuộc gọi GetData hoàn tất. Nói cách khác, bản vẽ và nhận được đồng bộ hóa để cuộc gọi GetData luôn xảy ra một số khung sau khi vẽ một loạt các miệng hố và bất kỳ yêu cầu vẽ miệng núi lửa mới nào cũng phải đợi cho đến khi GetData đang chờ xử lý.

Nếu bất cứ ai khác có bất kỳ đề nghị nào khác, tôi vẫn sẽ rất vui khi nghe họ.


Tôi đã tự hỏi: nếu trò chơi theo lượt, bạn không thể thực hiện một GetData()cuộc gọi vào đầu mỗi lượt?
Jonathan Connell
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.