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.
Topik terkait