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.
Tematy pokrewne