Condividi tramite


Come riprendere un'app (DirectX e C++)

Questo argomento illustra come ripristinare dati importanti dell'applicazione quando il sistema riprende l'app DirectX sulla piattaforma UWP (Universal Windows Platform).

Registrare il gestore di ripresa eventi

Registrare per gestire l'evento CoreApplication::Resuming, che indica che l'utente si è allontanato dall'app e poi è tornato.

Aggiungere questo codice all'implementazione del metodo IFrameworkView::Initialize del provider di visualizzazioni:

// 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);
    
  //...

}

Aggiornare il contenuto visualizzato dopo la sospensione

Quando l'app gestisce l'evento Resuming, ha la possibilità di aggiornare il contenuto visualizzato. Ripristinare qualsiasi app salvata con il gestore per CoreApplication::Suspending e riavviare l'elaborazione. Sviluppatori di giochi: se è stato sospeso il motore audio, è il momento di riavviarlo.

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.
}

Questo callback si verifica quando un messaggio di evento viene elaborato da CoreDispatcher per il CoreWindow dell'app. Questo callback non verrà richiamato se non si chiama CoreDispatcher::ProcessEvents dal ciclo principale dell'app (implementato nel metodo IFrameworkView::Run del provider di visualizzazioni).

// 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);
        }
    }
}

Osservazioni:

Il sistema sospende l'app ogni volta che l'utente passa a un'altra app o alla schermata desktop. Il sistema riprende l'app ogni qualvolta l'utente torna ad essa. Quando il sistema riprende l'app, il contenuto delle variabili e delle strutture dati corrisponde a quello precedente alla sospensione dell'app da parte del sistema. Il sistema ripristina l'app esattamente da dove era stata interrotta, in modo che appaia all'utente come se fosse in esecuzione in background. Tuttavia, l'app potrebbe essere stata sospesa per un periodo di tempo significativo, quindi dovrebbe aggiornare qualsiasi contenuto visualizzato che potrebbe essere stato modificato in quel lasso di tempo e riavviare qualsiasi rendering o thread di elaborazione audio. Se sono stati salvati dati sullo stato del gioco durante un evento di sospensione precedente, ripristinarli ora.