Praktik terbaik untuk mengatur parameter Efek di XNA

13

Saya ingin bertanya apakah ada praktik terbaik untuk mengatur Effectparameter di XNA. Atau dengan kata lain, apa yang sebenarnya terjadi ketika saya menelepon pass.Apply(). Saya bisa membayangkan beberapa skenario:

  1. Setiap kali Applydipanggil, semua parameter efek ditransfer ke GPU dan karenanya tidak memiliki pengaruh nyata seberapa sering saya menetapkan parameter.
  2. Setiap kali Applydipanggil, hanya parameter yang direset yang ditransfer. Jadi caching Set-operasi yang tidak benar-benar menetapkan nilai baru harus dihindari.
  3. Setiap kali Applydipanggil, hanya parameter yang diubah yang ditransfer. Jadi caching Set-operasi tidak berguna.
  4. Seluruh pertanyaan ini tidak dapat dibooting karena tidak ada satu pun dari cara yang disebutkan yang memiliki dampak penting pada kinerja game.

Jadi pertanyaan terakhir: Apakah berguna untuk mengimplementasikan beberapa caching operasi set seperti:

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

Terima kasih atas antisipasi.

0xBADF00D
sumber
Saya menambahkan tag DirectX, dengan dasar bahwa ini adalah fungsionalitas level yang lebih rendah daripada XNA.
Andrew Russell
Saya telah menemukan bukti bahwa topik yang dibahas SANGAT layak. Sepertinya jika Anda pintar dengan cara Anda mengatur parameter efek Anda, Anda dapat meningkatkan jumlah panggilan draw (yaitu seberapa cepat mereka diproses pada CPU) lebih dari dua kali. Saya masih dalam proses pengujian ini, Anda dapat membaca pertanyaan saya di sini: gamedev.stackexchange.com/questions/66932/…
cubrman

Jawaban:

8

Ini semua terjadi di sisi CPU, jadi jika caching adalah fitur yang berguna, maka saya akan berspekulasi bahwa driver grafis akan mengimplementasikannya sendiri. Menambahkan lapisan caching Anda sendiri tidak perlu.

Pemahaman saya adalah bahwa setiap kali Anda menetapkan parameter, dan setiap kali Anda menelepon Apply, panggilan ini diteruskan ke DirectX sebagian besar apa adanya, dan pada gilirannya diteruskan ke driver mode pengguna GPU apa adanya. Driver mode pengguna kemudian dapat melakukan apa pun yang diinginkannya . Ketiga skenario Anda dimungkinkan.

(Karena skenario # 2 adalah suatu kemungkinan, mungkin yang terbaik adalah tidak menjalankan parameter pengaturan yang tidak diubah dengan sengaja .)

Sejujurnya, saya tidak begitu yakin apa yang dilakukan oleh pengemudi biasa. Sebagian besar karena itu tidak pernah benar-benar muncul sebagai masalah. Saya tidak pernah mendengar ada yang memiliki pengaturan efek-parameter sebagai hambatan. Mungkin secara teori. Tetapi ada begitu banyak hal umum yang perlu dikhawatirkan .

Tentu saja jangan mulai menerapkan optimisasi seperti ini tanpa mengukur kinerja Anda dan memahami apa yang terjadi.

Juga, membandingkan Matrixdengan ==adalah voodoo buruk. A Matrixterdiri dari floats, dan perbandingan kesetaraan floating-point cenderung gagal dalam banyak kasus.

Dan, secara umum, polanya if(x != y) x = y;lebih lambat dari sekadar x = y.

Andrew Russell
sumber
Poin menarik yang harus diperhatikan pengemudi adalah hal ini. Terima kasih atas tautannya (dan tautan ulang).
0xBADF00D
Saya baru-baru ini menemukan contoh instancing geometri dari msdn . Mengatur ulang renderstate yang sama (dengan nilai yang sama) beberapa kali per frame secara signifikan memperlambat proses rendering sebanyak dua atau tiga kali. Jadi batching negara sangat bermanfaat. Sayangnya saya tidak yakin cuaca situasi ini berlaku untuk mengatur parameter efek juga. Tetapi saya ingin membagikan informasi saya.
0xBADF00D
4

Satu hal menarik yang saya temukan tentang topik ini.

Dari msdn:

Anda dapat menggunakan properti yang diindeks Parameter pada Efek untuk mengakses parameter efek apa pun, tetapi ini lebih lambat daripada menggunakan EffectParameters. Untuk alasan ini, Anda harus membuat EffectParameter untuk setiap parameter efek yang sering berubah.

dan

Membuat dan menetapkan instance EffectParameter untuk setiap teknik di Efek Anda secara signifikan lebih cepat daripada menggunakan properti Parameter yang diindeks pada Efek.

Itu berarti _effect.Parameters["xWorld"].SetValue(value);jauh lebih lambat daripadawordlParam.SetValue(value);

Jadi Anda mungkin harus men-cache parameter seperti ini:

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

Tapi saya belum menemukan tolok ukur yang sebenarnya.

Sumber:

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

zigzag
sumber
Baru saja menguji ini pada emulator Monogame dan WP - saya dapat mengkonfirmasi bahwa memang, ada perbedaan yang signifikan (antara 5-15% dalam kasus saya). Apakah ada trik lain yang membantu dalam kinerja?
Konrad