다중 스레딩 문제(Direct3D 9)

전체 화면 Direct3D 애플리케이션은 Direct3D 런타임에 대한 창 핸들을 제공합니다. 창은 런타임에 연결됩니다. 즉, 애플리케이션의 창 메시지 프로시저에 전달된 모든 메시지는 Direct3D 런타임의 자체 메시지 처리 프로시저에서 먼저 검사되었습니다.

디스플레이 모드 변경은 기본 운영 체제에 기본 제공되는 지원 루틴의 영향을 받습니다. 모드가 변경되면 시스템은 모든 애플리케이션에 여러 메시지를 브로드캐스트합니다. Direct3D 애플리케이션에서 메시지는 창 프로시저 스레드에서 수신됩니다. 이는 반드시 IDirect3DDevice9::Reset 또는 IDirect3D9::CreateDevice (또는 표시 모드 변경을 일으킬 수 있는 IDirect3DDevice9의 최종 릴리스)라고 하는 스레드와 동일하지는 않습니다. Direct3D 런타임은 내부적으로 몇 가지 중요한 섹션을 유지 관리합니다. 이러한 중요한 섹션 중 하나 이상이 IDirect3DDevice9::Reset 또는 IDirect3D9::CreateDevice로 인한 모드 스위치에서 유지되므로 애플리케이션이 모드 변경 관련 창 메시지를 수신할 때 이러한 중요한 섹션은 계속 유지됩니다.

이 디자인은 다중 스레드 애플리케이션에 몇 가지 영향을 줍니다. 특히 애플리케이션은 Direct3D 스레드에서 창 메시지 처리 스레드를 강력하게 분리해야 합니다. 한 스레드에서 모드를 변경하지만 창 프로시저에서 다른 스레드에서 Direct3D를 호출하는 애플리케이션은 교착 상태에 빠질 위험이 있습니다.

이러한 이유로 Direct3D는 IDirect3DDevice9::Reset, IDirect3D9::CreateDevice, IDirect3DDevice9::TestCooperativeLevel 또는 IDirect3DDevice9 의 최종 릴리스를 창 메시지를 처리하는 동일한 스레드에서만 호출할 수 있도록 설계되었습니다.

프로그래밍 팁