DirectX Graphics 프로그래밍 가이드 고도의 주제 비동기 통지 [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
퍼포먼스에 영향을 주지 않으면 애플리케이션을 드라이버에 대해서 실시할 수 있는 흥미로운 문의가 다수 있다. Microsoft® DirectX® 7.0 및 DirectX 8. x 에는,GetInfo 라고 하는 동기적 문의 메카니즘이 있었다. 이 메카니즘은 통계 정보등의 문의에 유효했지만, 퍼포먼스에 큰 영향을 미치는 문의는 포함되지 않았다. 이것에 대해, 펜스 등은 본질적으로 비동기적이다. 이것은 단순한 애플리케이션 프로그래밍 인터페이스 (API)로, 동기와 비동기의 양쪽 모두의 문의를 실시할 수가 있다. DirectX 9.0 에서는 GetInfo 는 사용할 수 없다.
문의를 생성 하려면 ,IDirect3DDevice9::CreateQuery 를 사용한다. 이 메서드는, 실행하는 문의의 종류를 정의하는 D3DQUERYTYPE 를 받아,IDirect3DQuery9 개체의 포인터를 돌려준다. 문의의 타입이 지원되지 않은 경우, 호출은 에러 D3DERR_NOTAVAILABLE 를 돌려준다. 이 개체를 사용하면 애플리케이션은 IDirect3DQuery9::Issue 로 런타임에 대해서 문의를 실행할 수 있어IDirect3DQuery9::GetData 로 문의의 스테이터스를 폴링 할 수 있다. 문의의 결과가 이용 가능한 경우는 S_OK 가 반환된다. 그 이외의 경우는 S_FALSE 가 반환된다. 애플리케이션은, 문의의 결과에 적절한 사이즈의 버퍼를 건네줄 필요가 있다.
애플리케이션은, D3DGETDATA_FLUSH 를 IDirect3DQuery9::GetData 와 함께 사용해, 런타임으로부터 드라이버에 강제적으로 문의를 플래시 할 수 있다. 이것에 의해, 플래시가 실행되어 드라이버에 강제적으로 문의가 전해진다. 이 때, 장치가 없어졌을 경우는, D3DERR_DEVICELOST 가 반환된다.
장치가 없어지면 모든 문의가 없어져 애플리케이션으로 문의를 생성 다시 할 필요가 있다. 장치가 문의를 지원 하고 있지 않는 경우로, pQueryID 가 NULL 의 경우, 문의의 생성이 실패해 D3DERR_INVALIDCALL 가 반환된다.
다음의 표는, 각문제 있어 맞댐 타입에 관한 중요한 정보를 집계한 것이다.
QuertyType | 유효한 발행 플래그 | GetData 버퍼 | 런타임 | 비명시적인 문의의 시작 |
---|---|---|---|---|
D3DQUERYTYPE_VCACHE | D3DISSUE_END | D3DDEVINFO_VCACHE | 리테일/디버그 | CreateDevice |
D3DQUERYTYPE_RESOURCEMANAGER | D3DISSUE_END | D3DDEVINFO_RESOURCEMANAGER | 디버그만 | Present |
D3DQUERYTYPE_VERTEXSTATS | D3DISSUE_END | D3DDEVINFO_D3DVERTEXSTATS | 디버그만 | Present |
D3DQUERYTYPE_EVENT | D3DISSUE_END | BOOL | 리테일/디버그 | CreateDevice |
D3DQUERYTYPE_OCCLUSION | D3DISSUE_BEGIN, D3DISSUE_END | DWORD | 리테일/디버그 | N/A |
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 // beginng of a query.
IDirect3DQuery9::GetData 의 플래그 필드
#define D3DGETDATA_FLUSH (1 << 0) // Tells the runtime to flush // if the query is outstanding.