Поделиться через


Перенос цикла игры

Сводка

Показывает, как реализовать окно для игры универсальная платформа Windows (UWP) и как перенести цикл игры, включая создание IFrameworkView для управления полноэкранным CoreWindow. Часть 3 из простого приложения Direct3D 9 на DirectX 11 и UWP .

Создание окна

Чтобы настроить окно рабочего стола с помощью окна просмотра Direct3D 9, нам пришлось реализовать традиционную платформу окон для классических приложений. Нам пришлось создать HWND, задать размер окна, предоставить обратный вызов обработки окна, сделать его видимым и т. д.

Среда UWP имеет гораздо более простую систему. Вместо настройки традиционного окна игра Microsoft Store с помощью DirectX реализует IFrameworkView. Этот интерфейс существует для приложений и игр DirectX, выполняемых непосредственно в CoreWindow в контейнере приложений.

Обратите внимание, что Windows предоставляет управляемые указатели на ресурсы, такие как объект исходного приложения и CoreWindow. См. раздел "Дескриптор для оператора объектов" (^).

 

Класс main должен наследоваться от IFrameworkView и реализовать пять методов IFrameworkView: Initialize, SetWindow, Load, Run и Uninitialize. Помимо создания IFrameworkView, который (по сути) будет находиться в вашей игре, необходимо реализовать класс фабрики , который создает экземпляр IFrameworkView. У вашей игры по-прежнему есть исполняемый файл с методом с именем main(), но все, что можно сделать, — использовать фабрику для создания экземпляра IFrameworkView .

Основная функция

//-----------------------------------------------------------------------------
// 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::Run (вместо main()), так как наши игровые функции в классе IFrameworkView.

Вместо реализации платформы обработки сообщений и вызова PeekMessage мы можем вызвать метод ProcessEvents, встроенный в ядро CoreDispatcher окна приложения. Нет необходимости в цикле игры ветвлять и обрабатывать сообщения - просто вызывать 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();
}

Теперь у нас есть приложение UWP, которое настраивает ту же базовую графическую инфраструктуру и отрисовывает тот же красочный куб, что и наш пример DirectX 9.

Что дальше?

Закладка вопросы и ответы о переносе DirectX 11.

Шаблоны UWP DirectX включают надежную инфраструктуру устройств Direct3D, которая готова к использованию с игрой. Сведения о выборе подходящего шаблона см. в статье "Создание игрового проекта DirectX на основе шаблона ".

Ознакомьтесь со следующими подробными статьями по разработке игр в Microsoft Store: