Saya ingin bertanya apakah ada praktik terbaik untuk mengatur Effect
parameter di XNA. Atau dengan kata lain, apa yang sebenarnya terjadi ketika saya menelepon pass.Apply()
. Saya bisa membayangkan beberapa skenario:
- Setiap kali
Apply
dipanggil, semua parameter efek ditransfer ke GPU dan karenanya tidak memiliki pengaruh nyata seberapa sering saya menetapkan parameter. - Setiap kali
Apply
dipanggil, hanya parameter yang direset yang ditransfer. Jadi caching Set-operasi yang tidak benar-benar menetapkan nilai baru harus dihindari. - Setiap kali
Apply
dipanggil, hanya parameter yang diubah yang ditransfer. Jadi caching Set-operasi tidak berguna. - 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.
Jawaban:
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
Matrix
dengan==
adalah voodoo buruk. AMatrix
terdiri darifloat
s, dan perbandingan kesetaraan floating-point cenderung gagal dalam banyak kasus.Dan, secara umum, polanya
if(x != y) x = y;
lebih lambat dari sekadarx = y
.sumber
Satu hal menarik yang saya temukan tentang topik ini.
Dari msdn:
dan
Itu berarti
_effect.Parameters["xWorld"].SetValue(value);
jauh lebih lambat daripadawordlParam.SetValue(value);
Jadi Anda mungkin harus men-cache parameter seperti ini:
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
sumber