Thực hành tốt nhất để thiết lập các tham số Hiệu ứng trong XNA


13

Tôi muốn hỏi liệu có cách thực hành tốt nhất để cài đặt Effecttham số trong XNA không. Hay nói cách khác, chính xác những gì xảy ra khi tôi gọi pass.Apply(). Tôi có thể tưởng tượng nhiều kịch bản:

  1. Mỗi lần Applyđược gọi, tất cả các tham số hiệu ứng được chuyển đến GPU và do đó nó không có ảnh hưởng thực sự đến tần suất tôi đặt tham số.
  2. Mỗi lần Applyđược gọi, chỉ các tham số được thiết lập lại được chuyển. Vì vậy, bộ nhớ đệm Các thao tác không thực sự đặt giá trị mới nên tránh.
  3. Mỗi lần Applyđược gọi, chỉ các tham số đã thay đổi được chuyển. Vì vậy, bộ nhớ đệm Các thao tác là vô ích.
  4. Toàn bộ câu hỏi này là không có khởi động bởi vì không ai trong số các cách đề cập có bất kỳ tác động đáng chú ý nào đến hiệu suất trò chơi.

Vì vậy, câu hỏi cuối cùng: Có hữu ích khi thực hiện một số bộ đệm của hoạt động thiết lập như:

private Matrix _world;
public Matrix World
{
    get{ return _world; }
    set 
    {
        if (value == world) return;
        _effect.Parameters["xWorld"].SetValue(value);
        _world = value;
    }
}

Cám ơn bạn với dự đoán.


Tôi đã thêm thẻ DirectX, trên cơ sở đây là chức năng cấp thấp hơn XNA.
Andrew Russell

Tôi đã tìm thấy bằng chứng rằng chủ đề trong tay là RẤT khả thi. Có vẻ như nếu bạn khéo léo với cách bạn đặt tham số hiệu ứng của mình, bạn có thể tăng số lượng cuộc gọi rút thăm (đó là tốc độ chúng được xử lý trên CPU) nhanh hơn hai lần. Tôi vẫn đang trong quá trình thử nghiệm, bạn có thể đọc câu hỏi của tôi ở đây: gamedev.stackexchange.com/questions/66932/
Kẻ

Câu trả lời:


8

Tất cả điều này xảy ra ở phía CPU, vì vậy nếu bộ nhớ đệm là một tính năng hữu ích, thì tôi sẽ suy đoán rằng trình điều khiển đồ họa sẽ tự thực hiện nó. Thêm lớp bộ nhớ đệm của riêng bạn là không cần thiết.

Tôi hiểu rằng bất cứ khi nào bạn đặt tham số và bất cứ khi nào bạn gọi Apply, các cuộc gọi này sẽ được chuyển sang DirectX phần lớn, và đến lượt nó được chuyển đến trình điều khiển GPU ở chế độ người dùng. Trình điều khiển chế độ người dùng sau đó có thể làm bất cứ điều gì nó muốn . Tất cả ba kịch bản của bạn đều có thể.

(Vì kịch bản # 2 là một khả năng, tốt nhất là không nên chạy xung quanh cố tình cài đặt lại các tham số không thay đổi.)

Thành thật mà nói, tôi không thực sự chắc chắn những gì một người lái xe thông thường làm. Chủ yếu là vì nó không bao giờ thực sự là một vấn đề. Tôi chưa bao giờ nghe nói về bất cứ ai có cài đặt tham số hiệu ứng như một nút cổ chai. Có lẽ nó có thể, trên lý thuyết. Nhưng có rất nhiều điều phổ biến hơn để lo lắng .

Chắc chắn không bắt đầu thực hiện tối ưu hóa như thế này mà không đo lường hiệu suất của bạn và hiểu những gì đang diễn ra.

Ngoài ra, so sánh a Matrixvới ==là voodoo xấu. A Matrixđược tạo thành từ floats và so sánh đẳng thức dấu phẩy động dễ bị thất bại trong nhiều trường hợp.

Và, nói chung, mô hình if(x != y) x = y;chậm hơn đơn giản x = y.


Điểm thú vị mà lái xe nên quan tâm về điều này. Cảm ơn các liên kết (và liên kết lại).
0xBADF00D

Gần đây tôi đã bắt gặp các ví dụ về hình học hình học từ msdn . Đặt lại cùng một kết xuất (có cùng giá trị) nhiều lần trên mỗi khung làm chậm đáng kể quá trình kết xuất hai hoặc ba lần. Vì vậy, hàng loạt nhà nước là rất hữu ích. Thật không may, tôi không chắc chắn thời tiết này cũng áp dụng cho việc cài đặt các tham số hiệu ứng. Nhưng tôi muốn chia sẻ thông tin của tôi.
0xBADF00D

4

Một điều thú vị tôi tìm thấy về chủ đề này.

Từ msd:

Bạn có thể sử dụng thuộc tính được lập chỉ mục Tham số trên Effect để truy cập bất kỳ tham số hiệu ứng nào, nhưng điều này chậm hơn so với sử dụng EffectParameter. Vì lý do này, bạn nên tạo một EffectParameter cho mỗi tham số hiệu ứng thay đổi thường xuyên.

Tạo và gán một phiên bản EffectParameter cho từng kỹ thuật trong Hiệu ứng của bạn nhanh hơn đáng kể so với việc sử dụng thuộc tính được lập chỉ mục Tham số trên Hiệu ứng.

Điều đó có nghĩa _effect.Parameters["xWorld"].SetValue(value);là chậm hơn đáng kể so vớiwordlParam.SetValue(value);

Vì vậy, bạn có thể nên lưu các tham số như thế này:

public EffectParameter wordlParam;
wordlParam = _effect.Parameters["xWorld"];

Nhưng tôi đã không tìm thấy bất kỳ điểm chuẩn thực tế.

Nguồn:

http://msdn.microsoft.com/en-us/l Library / Macrosoft.Xna.Framework.Graphics.EffectParameter% 28v = xnagamestudio.40% 29.aspx http://msdn.microsoft.com/en-us/l Library /bb976060%28v=xnagamestudio.31%29.aspx


Chỉ cần thử nghiệm điều này trên trình giả lập Monogame và WP - tôi có thể xác nhận rằng thực sự, có một sự khác biệt đáng kể (trong khoảng 5-15% trong trường hợp của tôi). Có bất kỳ thủ thuật như vậy giúp trong hiệu suất?
Konrad
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.