게임 루프 포팅
요약
- 1부: Direct3D 11 초기화
- 2부: 렌더링 프레임워크 변환
- 3부: 게임 루프 포팅
UWP(유니버설 Windows 플랫폼) 게임용 창의 구현 방법과 전체 화면 CoreWindow를 제어하는 IFrameworkView의 빌드 방법을 포함하여 게임 루프를 가져오는 방법을 보여 줍니다. DirectX 11 및 UWP 연습에 대한 간단한 Direct3D 9 앱 포트 연습 3부.
창 생성
Direct3D 9 뷰포트를 사용하여 데스크톱 창을 설정하려면 데스크톱 앱에 대한 기존 창 프레임워크를 구현해야 했습니다. HWND를 생성하고, 창 크기를 설정하며, 창 처리 콜백을 제공하고, 표시되도록 해야 했습니다.
UWP 환경에는 매우 간편한 시스템이 있습니다. Microsoft Store 게임은 기존의 창을 설정하는 대신 DirectX를 사용하는 IFrameworkView를 구현합니다. 이 인터페이스는 DirectX 앱 및 게임이 앱 컨테이너 내의 CoreWindow에서 직접 실행될 수 있도록 존재합니다.
참고 Windows는 원본 애플리케이션 개체 및 CoreWindow와 같은 리소스에 관리되는 포인터를 제공합니다. 개체 연산자에 대한 핸들(^)을 참조하세요.
'기본' 클래스는 IFrameworkView에서 상속하고 5개의 IFrameworkView 메서드인 Initialize, SetWindow, Load, Run, Uninitialize를 구현해야 합니다. 게임이 상주하는 IFrameworkView를 생성하는 것 외에도 IFrameworkView의 인스턴스를 생성하는 팩터리 클래스를 구현해야 합니다. 게임에는 여전히 기본()이라는 메서드가 있는 실행 파일이 있지만, 기본 수행할 수 있는 모든 작업은 팩터리를 사용하여 IFrameworkView 인스턴스를 생성하는 것입니다.
main 함수
//-----------------------------------------------------------------------------
// Required method for a DirectX-only app.
// The main function is only used to initialize the app's IFrameworkView class.
//-----------------------------------------------------------------------------
[Platform::MTAThread]
int main(Platform::Array<Platform::String^>^)
{
auto direct3DApplicationSource = ref new Direct3DApplicationSource();
CoreApplication::Run(direct3DApplicationSource);
return 0;
}
IFrameworkView 팩터리
//-----------------------------------------------------------------------------
// This class creates our IFrameworkView.
//-----------------------------------------------------------------------------
ref class Direct3DApplicationSource sealed :
Windows::ApplicationModel::Core::IFrameworkViewSource
{
public:
virtual Windows::ApplicationModel::Core::IFrameworkView^ CreateView()
{
return ref new Cube11();
};
};
게임 루프 포팅
Direct3D 9 구현에서 게임 루프를 살펴보겠습니다. 이 코드는 앱의 기본 함수에 있습니다. 각 루프의 반복으로 창 메시지를 처리하거나 프레임을 렌더링합니다.
Direct3D 9 데스크톱 게임의 게임 루프
while(WM_QUIT != msg.message)
{
// Process window events.
// Use PeekMessage() so we can use idle time to render the scene.
bGotMsg = (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE) != 0);
if(bGotMsg)
{
// Translate and dispatch the message
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
// Render a new frame.
// Render frames during idle time (when no messages are waiting).
RenderFrame();
}
}
게임의 UWP 버전에서는 게임 루프가 비슷하지만 더 쉽습니다.
게임 루프는 IFrameworkView 클래스 내에서 게임이 작동하기 때문에 IFrameworkView::Run 메서드(기본() 대신)로 이동합니다.
메시지 처리 프레임워크를 구현하고 PeekMessage를 호출하는 대신 앱 창의 CoreDispatcher에 기본 제공되는 ProcessEvents 메서드를 호출할 수 있습니다. 게임 루프가 메시지를 분기하고 처리할 필요가 없습니다. ProcessEvents를 호출하고 계속 진행하기만 하면 됩니다.
Direct3D 11 Microsoft Store 게임의 게임 루프
// UWP apps should not exit. Use app lifecycle events instead.
while (true)
{
// Process window events.
auto dispatcher = CoreWindow::GetForCurrentThread()->Dispatcher;
dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);
// Render a new frame.
RenderFrame();
}
이제 DirectX 9 예제와 동일한 기본 그래픽 인프라를 설정하고 동일한 다양한 큐브를 렌더링하는 UWP 앱이 있습니다.
여기에서 어떻게 하나요?
DirectX 11 포팅 FAQ에 책갈피를 지정합니다.
DirectX UWP 템플릿에는 게임에 사용할 준비가 된 강력한 Direct3D 디바이스 인프라가 포함되어 있습니다. 올바른 템플릿을 선택하는 방법에 대한 지침은 템플릿에서 DirectX 게임 프로젝트 생성을 참조하세요.
다음과 같이 심층적인 Microsoft Store 게임 개발 문서를 참조하세요.