비동기 알림(Direct3D 9)

성능 비용이 없는 경우 애플리케이션에서 만들 수 있는 드라이버에 대한 흥미로운 쿼리 수가 있습니다. Direct3D 7 및 Direct3D 8에서는 동기 쿼리 메커니즘인 GetInfo가 통계와 같은 항목에서 잘 작동했지만 성능에 중요한 쿼리는 추가되지 않았습니다. 본질적으로 비동기적인 다른 것들(예: 울타리)이 있습니다. 이는 동기 쿼리와 비동기 쿼리를 모두 만드는 간단한 API입니다. GetInfo는 Direct3D 9에서 사용 중지됩니다.

IDirect3DDevice9::CreateQuery를 사용하여 쿼리를 만듭니다. 이 메서드는 만들 쿼리 종류를 정의하고 IDirect3DQuery9 개체에 대한 포인터를 반환하는 D3DQUERYTYPE을 사용합니다. 쿼리 형식이 지원되지 않으면 호출은 오류 D3DERR_NOTAVAILABLE 반환합니다. 애플리케이션은 쿼리 개체를 사용하여 IDirect3DQuery9::Issue를 사용하여 런타임에 쿼리를 제출하고 IDirect3DQuery9::GetData를 사용하여 쿼리 상태 폴링합니다. 쿼리 결과를 사용할 수 있으면 S_OK 반환됩니다. 그렇지 않으면 S_FALSE 반환됩니다. 애플리케이션은 쿼리 결과에 적절한 크기의 버퍼를 전달해야 합니다.

애플리케이션에는 IDirect3DQuery9::GetData와 함께 D3DGETDATA_FLUSH 사용하여 런타임이 쿼리를 드라이버로 강제로 플러시하도록 하는 옵션이 있습니다. 이로 인해 플러시로 인해 드라이버가 쿼리를 강제로 볼 수 있습니다. 이 경우 디바이스가 손실되면 D3DERR_DEVICELOST 반환됩니다.

디바이스가 손실되면 모든 쿼리가 손실되고 애플리케이션에서 다시 만들어야 합니다. 디바이스가 쿼리를 지원하지 않고 pQueryID가 NULL이면 D3DERR_INVALIDCALL 쿼리 만들기가 실패합니다.

다음 표에서는 각 쿼리 유형에 대한 중요한 정보를 요약합니다.

QuertyType 유효한 문제 플래그 GetData 버퍼 런타임 쿼리의 암시적 시작
D3DQUERYTYPE_VCACHE D3DISSUE_END D3DDEVINFO_VCACHE 소매/디버그 CreateDevice
D3DQUERYTYPE_ResourceManager D3DISSUE_END D3DDEVINFO_ResourceManager 디버그만 표시
D3DQUERYTYPE_VERTEXSTATS D3DISSUE_END D3DDEVINFO_D3DVERTEXSTATS 디버그만 표시
D3DQUERYTYPE_EVENT D3DISSUE_END BOOL 소매/디버그 CreateDevice
D3DQUERYTYPE_OCCLUSION D3DISSUE_BEGIN,D3DISSUE_END DWORD 소매/디버그 해당 없음

 

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. 

IDirect3DQuery9::GetData에 대한 플래그 필드:

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

프로그래밍 팁