다음을 통해 공유


게임 루프 포팅

요약

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 게임 개발 문서를 참조하세요.