Chi phí thực tế của hiệu ứng tráo đổi


16

Tôi sử dụng XNA cho các dự án của mình và trên các diễn đàn đó, đôi khi tôi thấy các tài liệu tham khảo về việc hoán đổi hiệu ứng cho lưới có chi phí khá cao, điều này làm tôi ngạc nhiên khi tôi nghĩ rằng việc hoán đổi hiệu ứng chỉ đơn giản là một trường hợp sao chép chương trình đổ bóng thay thế đến GPU cùng với các thông số phù hợp.

Tôi tự hỏi nếu ai đó có thể giải thích chính xác những gì tốn kém về quá trình này? Và đặt, nếu có thể, "tương đối" vào bối cảnh?

Ví dụ, tôi muốn sử dụng một shader ngắn để giúp chọn, tôi sẽ:

  1. Thay đổi hiệu ứng trên mọi đối tượng, lấy một màu duy nhất để xác định nó và cung cấp cho shader.
  2. Vẽ tất cả các đối tượng vào một mục tiêu kết xuất trong bộ nhớ.
  3. Lấy màu từ mục tiêu và sử dụng nó để tra cứu đối tượng đã chọn.

Phần nào của tổng thời gian cần thiết để hoàn thành quá trình đó sẽ được dành để hoán đổi các shader? Bản năng của tôi sẽ nói rằng việc dựng lại cảnh một lần nữa, cho dù trình tạo bóng đơn giản đến đâu, sẽ là một thứ tự cường độ chậm hơn bất kỳ phần nào khác của quá trình, vậy tại sao tất cả lại quan tâm đến hiệu ứng?

Câu trả lời:


21

Vấn đề bạn đang mô tả không phải là vấn đề "đặc biệt". Không có gì đặc biệt chậm về việc thay đổi hiệu ứng trên GPU. Vấn đề với việc thay đổi hiệu ứng, tham số hiệu ứng (bao gồm biến đổi), kết cấu, trạng thái kết xuất khác nhau và chỉ cần gửi nhiều lệnh vẽ, là nó bắt buộc phải gửi một lô khác đến GPU .

Các lô được liên kết với CPU và bạn chỉ nhận được vài nghìn * cho mỗi khung hình để sử dụng.

Nó phụ thuộc vào CPU và những công việc khác mà bạn đang làm, nhưng giả sử bạn nhận được khoảng 1000 lô trên mỗi khung. Nếu bạn đang hiển thị một đối tượng mỗi đợt, bạn có thể vẽ khoảng 1000 đối tượng trên màn hình trước khi gặp sự cố.

Nếu bạn đột nhiên thêm chọn và bạn phải kết xuất tất cả các đối tượng của mình hai lần, thì bạn bị giới hạn chỉ vẽ 500 đối tượng.

(Vì vậy, nếu bạn chỉ có một số lượng nhỏ các đối tượng, thì đừng lo lắng về điều đó!)

Để giảm số lượng lô bạn đang sử dụng, về cơ bản bạn phải "khéo léo" về nó. Phương pháp nguyên mẫu để thực hiện điều này là kết hợp khéo léo nhiều đối tượng thành một lô duy nhất. Đặc biệt, tìm kiếm " instaging ". Có lẽ bạn có thể sử dụng số hiệu để gán một màu duy nhất cho từng đối tượng trong shader của mình.

Một kỹ thuật, đặc biệt thích hợp cho thu hái, là để tiêu hủy các đối tượng trả lại trong phần mềm để bạn không render bất cứ điều gì bạn biết là không chạm vào điểm ảnh chọn của bạn.

Đây là toàn bộ bản trình bày từ NVidia có tiêu đề "Batch, Batch, Batch: Điều đó thực sự có nghĩa là gì?" (PDF) có đồ thị đẹp và công cụ giải thích điều này. Nó cũng liệt kê một số kỹ thuật để giảm số lượng hàng loạt của bạn.


Đã đồng ý! Cảm ơn bạn đã giải thích và những gợi ý, những gì tôi đọc làm cho rất nhiều ý nghĩa bây giờ. Cũng cảm ơn vì bài thuyết trình của NVidia, tôi chỉ đọc nó bây giờ và nó rất hữu ích.
sebf

1
Liên kết được cập nhật đến giấy "Batch, Batch, Batch": ce.u-sys.org/Veranstaltungen/ Kẻ
Marton

1
Cảm ơn Marton, tôi đã chỉnh sửa liên kết mới vào bài đăng :)
Andrew Russell
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.