Bagikan melalui


Pemberitahuan Asinkron (Direct3D 9)

Ada sejumlah kueri menarik pada driver yang dapat dibuat aplikasi jika tidak ada biaya performa. Di Direct3D 7 dan Direct3D 8, mekanisme kueri sinkron, GetInfo, bekerja dengan baik untuk hal-hal seperti statistik, tetapi tidak ada kueri kritis performa yang ditambahkan. Ada hal-hal lain (seperti pagar) yang secara inheren asinkron. Ini adalah API sederhana untuk membuat kueri sinkron dan asinkron. GetInfo akan pensiun di Direct3D 9.

Buat kueri menggunakan IDirect3DDevice9::CreateQuery. Metode ini mengambil D3DQUERYTYPE, yang menentukan jenis kueri apa yang akan dibuat dan mengembalikan penunjuk ke objek IDirect3DQuery9 . Jika jenis kueri tidak didukung, panggilan mengembalikan kesalahan D3DERR_NOTAVAILABLE. Menggunakan objek kueri, aplikasi mengirimkan kueri ke runtime menggunakan IDirect3DQuery9::Issue, dan polling status kueri menggunakan IDirect3DQuery9::GetData. Jika hasil kueri tersedia, S_OK dikembalikan; jika tidak, S_FALSE dikembalikan. Aplikasi ini diharapkan meneruskan buffer berukuran tepat untuk hasil kueri.

Aplikasi memiliki opsi untuk memaksa runtime untuk menghapus kueri ke driver dengan menggunakan D3DGETDATA_FLUSH dengan IDirect3DQuery9::GetData. Ini menyebabkan flush, memaksa driver untuk melihat kueri. Dalam hal ini, D3DERR_DEVICELOST dikembalikan jika perangkat hilang.

Semua kueri hilang ketika perangkat hilang, aplikasi harus membuatnya kembali. Jika perangkat tidak mendukung kueri dan pQueryID ADALAH NULL, pembuatan kueri akan gagal dengan D3DERR_INVALIDCALL.

Tabel berikut ini merangkum informasi penting tentang setiap jenis kueri.

QuertyType Bendera masalah yang valid Buffer GetData Runtime Awal kueri implisit
D3DQUERYTYPE_VCACHE D3DISSUE_END D3DDEVINFO_VCACHE Ritel/Debug CreateDevice
D3DQUERYTYPE_ResourceManager D3DISSUE_END D3DDEVINFO_ResourceManager Debug saja Hadir
D3DQUERYTYPE_VERTEXSTATS D3DISSUE_END D3DDEVINFO_D3DVERTEXSTATS Debug saja Hadir
D3DQUERYTYPE_EVENT D3DISSUE_END BOOL Ritel/Debug CreateDevice
D3DQUERYTYPE_OCCLUSION D3DISSUE_BEGIN,D3DISSUE_END DWORD Ritel/Debug T/A

 

Bidang bendera untuk IDirect3DQuery9::Issue:

#define D3DISSUE_END (1 << 0) 
// Tells the runtime to issue the end of a query, changing its state to 
//   "non-signaled" 
 
#define D3DISSUE_BEGIN (1 << 1) // Tells the runtime to issue the 
// beginning of a query. 

Bidang bendera untuk IDirect3DQuery9::GetData:

 
#define D3DGETDATA_FLUSH (1 << 0) // Tells the runtime to flush 
// if the query is outstanding.

Tips Pemrograman