샘플 게임 확장
참고 항목
이 항목은 DirectX를 사용하여 간단한 UWP(유니버설 Windows 플랫폼) 게임 만들기 자습서 시리즈의 일부입니다. 해당 링크의 항목은 시리즈의 컨텍스트를 설정합니다.
XAML을 오버레이에 사용하는 이 게임 버전을 다운로드하려면 DirectX 및 XAML 게임 샘플을 참조하세요. 샘플 빌드에 대한 자세한 내용은 추가 정보 파일을 참조하세요.
지금까지 기본적인 UWP(유니버설 Windows 플랫폼) DirectX 3D 게임의 주요 구성 요소에 대해 알아보았습니다. 보기 공급자 및 렌더링 파이프라인을 포함한 게임의 프레임워크를 설정하고 기본 게임 루프를 구현할 수 있습니다. 또한 기본 사용자 인터페이스 오버레이를 만들고 소리를 통합하고 컨트롤을 구현할 수 있습니다. 지금은 자신만의 고유한 게임을 만들고 있지만, 더 많은 도움말 및 정보가 필요한 경우 다음 리소스를 확인합니다.
오버레이에 XAML 사용
자세히 살펴보지 않은 한 가지 다른 방법은 Direct2D 대신 XAML을 오버레이에 사용하는 것입니다. XAML은 사용자 인터페이스 요소를 그리는 데 Direct2D 보다 많은 이점이 있습니다. 가장 중요한 이점은 Windows 10의 모양과 느낌을 DirectX 게임에 훨씬 통합할 수 있다는 것입니다. UWP 앱을 정의하는 수많은 공통 요소, 스타일, 동작은 XAML 모델에 긴밀하게 통합되어 있어 게임 개발자가 구현하는 작업이 훨씬 적어집니다. 고유 게임 디자인에 복잡한 사용자 인터페이스가 있는 경우, Direct2D 대신 XAML 사용을 고려하세요.
XAML에서는 Direct2D와 비슷한 모양의 게임 인터페이스를 훨씬 손쉽게 만들 수 있습니다.
XAML
Direct2D
최종 결과는 비슷하지만, Direct2D 구현과 XAML 인터페이스 구현 간에 많은 차이점이 있습니다.
기능 | XAML | Direct2D |
---|---|---|
오버레이 정의 | \*.xaml XAML 파일에 정의되어 있습니다. XAML을 이해하면 Direct2D에 비해 더 복잡한 오버레이를 만들고 구성하는 것이 더 간단합니다. |
Direct2D 대상 버퍼에 수동으로 배치되고 기록되는 Direct2D 원형 및 DirectWrite 문자열 컬렉션으로 정의됩니다. |
사용자 인터페이스 요소 | XAML 사용자 인터페이스 요소는 Windows::UI::Xaml 및 Windows::UI::Xaml::Controls를 포함하여 Windows 런타임 XAML API의 일부인 표준화된 요소에서 가져옵니다. XAML 사용자 인터페이스 요소의 동작을 처리하는 코드는 codebehind 파일 Main.xaml.cpp에서 정의됩니다. | 사각형 및 줄임표처럼 간단한 도형을 그릴 수 있습니다. |
창 크기 조정 | 핸들 크기를 자연스럽게 조정하고 상태 변경 이벤트를 확인하여 그에 따라 오버레이를 변환합니다. | 오버레이의 구성 요소를 다시 그리는 방법을 수동으로 지정해야 합니다. |
또 다른 큰 차이점은 스왑 체인과 관련이 있습니다. 스왑 체인을 Windows::UI::Core::CoreWindow 개체에 연결할 필요가 없습니다. 대신에 SwapChainPanel 개체가 새로 구성되면 XAML이 통합된 DirectX 앱을 스왑 체인을 연결합니다.
다음 조각은 DirectXPage.xaml 파일에서 SwapChainPanel을 위한 XAML을 선언하는 방법을 보여 줍니다.
<Page
x:Class="Simple3DGameXaml.DirectXPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Simple3DGameXaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<SwapChainPanel x:Name="DXSwapChainPanel">
<!-- ... XAML user controls and elements -->
</SwapChainPanel>
</Page>
SwapChainPanel 개체는 시작 시 앱 싱글톤에서 생성된 현재 창 개체의 콘텐츠 속성으로 설정됩니다.
void App::OnLaunched(_In_ LaunchActivatedEventArgs^ /* args */)
{
m_mainPage = ref new DirectXPage();
Window::Current->Content = m_mainPage;
// Bring the application to the foreground so that it's visible
Window::Current->Activate();
}
구성된 스왑 체인을 XAML에 정의된 SwapChainPanel 인스턴스에 연결하려면 기본 네이티브 ISwapChainPanelNative 인터페이스 구현에 대한 포인터를 가져오고 여기에서 ISwapChainPanelNative::SetSwapChain을 호출하여 구성된 스왑 체인에 전달해야 합니다.
DX::DeviceResources::CreateWindowSizeDependentResources에서 나온 다음 조각에는 DirectX/XAML 상호 운용성을 위한 이 기능이 자세히 설명되어 있습니다.
ComPtr<IDXGIDevice3> dxgiDevice;
DX::ThrowIfFailed(
m_d3dDevice.As(&dxgiDevice)
);
ComPtr<IDXGIAdapter> dxgiAdapter;
DX::ThrowIfFailed(
dxgiDevice->GetAdapter(&dxgiAdapter)
);
ComPtr<IDXGIFactory2> dxgiFactory;
DX::ThrowIfFailed(
dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory))
);
// When using XAML interop, the swap chain must be created for composition.
DX::ThrowIfFailed(
dxgiFactory->CreateSwapChainForComposition(
m_d3dDevice.Get(),
&swapChainDesc,
nullptr,
&m_swapChain
)
);
// Associate swap chain with SwapChainPanel
// UI changes will need to be dispatched back to the UI thread
m_swapChainPanel->Dispatcher->RunAsync(CoreDispatcherPriority::High, ref new DispatchedHandler([=]()
{
// Get backing native interface for SwapChainPanel
ComPtr<ISwapChainPanelNative> panelNative;
DX::ThrowIfFailed(
reinterpret_cast<IUnknown*>(m_swapChainPanel)->QueryInterface(IID_PPV_ARGS(&panelNative))
);
DX::ThrowIfFailed(
panelNative->SetSwapChain(m_swapChain.Get())
);
}, CallbackContext::Any));
// Ensure that DXGI does not queue more than one frame at a time. This both reduces latency and
// ensures that the application will only render after each VSync, minimizing power consumption.
DX::ThrowIfFailed(
dxgiDevice->SetMaximumFrameLatency(1)
);
}
이 프로세스에 대한 자세한 내용은 DirectX 및 XAML interop을 참조하세요.
Sample
XAML을 오버레이에 사용하는 이 게임 버전을 다운로드하려면 DirectX 및 XAML 게임 샘플을 참조하세요. 샘플 빌드에 대한 자세한 내용은 추가 정보 파일을 참조하세요.
나머지 항목에서 논의한 샘플 게임 버전과 달리, XAML 버전은 App.cpp 및 GameInfoOverlay.cpp 대신에 App.xaml.cpp 및 DirectXPage.xaml.cpp 파일에서 프레임워크를 정의합니다.