Udostępnij za pośrednictwem


Powiadomienie asynchroniczne (Direct3D 9)

Istnieje wiele interesujących zapytań dotyczących sterownika, które aplikacja może wykonać, jeśli nie ma żadnych kosztów wydajności. W usługach Direct3D 7 i Direct3D 8 mechanizm zapytania synchronicznego GetInfo dobrze sprawdzał się w przypadku takich elementów jak statystyki, ale nie dodano zapytań o znaczeniu krytycznym dla wydajności. Istnieją inne rzeczy (takie jak ogrodzenia), które są z natury asynchroniczne. Jest to prosty interfejs API umożliwiający wykonywanie zapytań synchronicznych i asynchronicznych. Polecenie GetInfo zostanie wycofane w wersji Direct3D 9.

Utwórz zapytanie przy użyciu IDirect3DDevice9::CreateQuery. Ta metoda przyjmuje D3DQUERYTYPE, która definiuje rodzaj zapytania do utworzenia i zwraca wskaźnik do obiektu IDirect3DQuery9. Jeśli typ zapytania nie jest obsługiwany, wywołanie zwraca błąd D3DERR_NOTAVAILABLE. Korzystając z obiektu zapytania, aplikacja przesyła zapytanie do środowiska uruchomieniowego przy użyciu IDirect3DQuery9::Problemi sonduje stan zapytania przy użyciu IDirect3DQuery9::GetData. Jeśli wynik zapytania jest dostępny, zostanie zwrócona S_OK; w przeciwnym razie zostanie zwrócona S_FALSE. Oczekuje się, że aplikacja przekaże odpowiedni bufor o rozmiarze dla wyników zapytania.

Aplikacja ma możliwość wymuszenia opróżnienia zapytania do sterownika przez środowisko uruchomieniowe przy użyciu D3DGETDATA_FLUSH z IDirect3DQuery9::GetData. Powoduje to opróżnienie, zmuszając sterownik do wyświetlenia zapytania. W takim przypadku D3DERR_DEVICELOST jest zwracana, jeśli urządzenie zostanie utracone.

Wszystkie zapytania zostaną utracone po utracie urządzenia, aplikacja musi je ponownie utworzyć. Jeśli urządzenie nie obsługuje zapytania, a wartość pQueryID jest null, tworzenie zapytania zakończy się niepowodzeniem z D3DERR_INVALIDCALL.

W poniższej tabeli podsumowane są ważne informacje o każdym typie zapytania.

QuerytyType Prawidłowa flaga problemu Bufor GetData Środowiska wykonawczego Niejawny początek zapytania
D3DQUERYTYPE_VCACHE D3DISSUE_END D3DDEVINFO_VCACHE Sprzedaż detaliczna/debugowanie CreateDevice
D3DQUERYTYPE_ResourceManager D3DISSUE_END D3DDEVINFO_ResourceManager Tylko debugowanie Prezentować
D3DQUERYTYPE_VERTEXSTATS D3DISSUE_END D3DDEVINFO_D3DVERTEXSTATS Tylko debugowanie Prezentować
D3DQUERYTYPE_EVENT D3DISSUE_END BOOL Sprzedaż detaliczna/debugowanie CreateDevice
D3DQUERYTYPE_OCCLUSION D3DISSUE_BEGIN,D3DISSUE_END DWORD Sprzedaż detaliczna/debugowanie N/A

 

Pole flagi dla IDirect3DQuery9::Problem:

#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. 

Pole flagi dla IDirect3DQuery9::GetData:

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

porady dotyczące programowania