アプリを再開する方法 (DirectX と C++)How to resume an app (DirectX and C++)

このトピックでは、ユニバーサル Windows プラットフォーム (UWP) DirectX アプリをシステムが再開するときに重要なアプリケーション データを復元する方法について説明します。This topic shows how to restore important application data when the system resumes your Universal Windows Platform (UWP) DirectX app.

Resuming イベント ハンドラーに登録するRegister the resuming event handler

CoreApplication::Resuming イベントを処理するために登録します。このイベントは、ユーザーがアプリを切り替えてから、アプリに戻ったことを示します。Register to handle the CoreApplication::Resuming event, which indicates that the user switched away from your app and then back to it.

このコードをビュー プロバイダーの IFrameworkView::Initialize メソッドの実装に追加します。Add this code to your implementation of the IFrameworkView::Initialize method of your view provider:

// The first method is called when the IFrameworkView is being created.
void App::Initialize(CoreApplicationView^ applicationView)
{
  //...
  
    CoreApplication::Resuming +=
        ref new EventHandler<Platform::Object^>(this, &App::OnResuming);
    
  //...

}

一時停止の後で表示されるコンテンツを更新するRefresh displayed content after suspension

アプリでは、Resuming イベントを処理する時点で、表示されているコンテンツを更新できます。When your app handles the Resuming event, it has the opportunity to refresh its displayed content. CoreApplication::Suspending のハンドラーで保存した任意のアプリを復元し、処理を再開します。Restore any app you have saved with your handler for CoreApplication::Suspending, and restart processing. ゲーム開発の場合、オーディオ エンジンを一時停止していたら、ここで再開します。Game devs: if you've suspended your audio engine, now's the time to restart it.

void App::OnResuming(Platform::Object^ sender, Platform::Object^ args)
{
    // Restore any data or state that was unloaded on suspend. By default, data
    // and state are persisted when resuming from suspend. Note that this event
    // does not occur if the app was previously terminated.

    // Insert your code here.
}

このコールバックは、アプリの CoreWindow. の CoreDispatcher によって処理されるイベント メッセージとして発生します。This callback occurs as an event message processed by the CoreDispatcher for the app's CoreWindow. このコールバックは、アプリのメイン ループ (ビュー プロバイダーの IFrameworkView::Run メソッドで実装) から CoreDispatcher::ProcessEvents を呼び出さない場合は呼び出されません。This callback will not be invoked if you do not call CoreDispatcher::ProcessEvents from your app's main loop (implemented in the IFrameworkView::Run method of your view provider).

// This method is called after the window becomes active.
void App::Run()
{
    while (!m_windowClosed)
    {
        if (m_windowVisible)
        {
            CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);

            m_main->Update();

            if (m_main->Render())
            {
                m_deviceResources->Present();
            }
        }
        else
        {
            CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessOneAndAllPending);
        }
    }
}

注釈Remarks

ユーザーが別のアプリまたはデスクトップに切り替えると、システムはアプリを中断します。The system suspends your app whenever the user switches to another app or to the desktop. ユーザーが元のアプリに戻すと、システムはアプリを再開します。The system resumes your app whenever the user switches back to it. システムがアプリを再開した時点で、変数とデータ構造の内容は、システムがアプリを一時停止する前の状態と同じです。When the system resumes your app, the content of your variables and data structures is the same as it was before the system suspended the app. システムはアプリを厳密に中断前の状態に復元するので、ユーザーからはアプリがバックグラウンドで実行していたように見えます。The system restores the app exactly where it left off, so that it appears to the user as if it's been running in the background. しかし、アプリは長時間一時停止している場合があるので、アプリが一時停止している間に変化した可能性のある表示コンテンツを更新し、レンダリングやオーディオ処理スレッドを再開する必要があります。However, the app may have been suspended for a significant amount of time, so it should refresh any displayed content that might have changed while the app was suspended, and restart any rendering or audio processing threads. 以前の一時中止イベント中にゲームの状態データを保存してある場合は、ここで復元します。If you've saved any game state data during a previous suspend event, restore it now.