Správa využití paměti v desktopových aplikacích Windows App SDK

Efektivní správa paměti pomáhá vaší aplikaci dobře fungovat, zejména na zařízeních s omezenými prostředky. Tento článek popisuje strategie správy paměti v desktopové aplikaci Windows App SDK, zejména pokud okno aplikace není viditelné.

Important

Desktopové aplikace nejsou systémem automaticky pozastavené . Při běhu dál spotřebovávají paměť. Proaktivní správa paměti zlepšuje celkovou odezvu systému a životnost baterie.

Monitorování využití paměti

Pomocí třídy Windows.System.MemoryManager můžete zkontrolovat využití paměti vaší aplikace a stav paměti v celém systému:

ulong appMemoryUsage = Windows.System.MemoryManager.AppMemoryUsage;
ulong appMemoryLimit = Windows.System.MemoryManager.AppMemoryUsageLimit;
Windows.System.AppMemoryUsageLevel level = Windows.System.MemoryManager.AppMemoryUsageLevel;

System.Diagnostics.Debug.WriteLine(
    $"Memory: {appMemoryUsage / 1024 / 1024} MB used, " +
    $"limit: {appMemoryLimit / 1024 / 1024} MB, level: {level}");

Můžete se také přihlásit k odběru MemoryManager.AppMemoryUsageLimitChanging a MemoryManager.AppMemoryUsageIncreased pro reakci na zatížení paměti.

Snížení paměti, když je okno skryté

I když systém neustaví vaši desktopovou aplikaci, můžete snížit spotřebu paměti, když je okno minimalizované nebo skryté. To zpřístupňuje více prostředků pro aplikaci na popředí a prodlužuje životnost baterie.

Zjištění, kdy je okno skryté

Microsoft.UI.Xaml.Window nezpřístupňuje VisibilityChanged událost. Místo toho použijte událost Window.Activated k rozpoznání, kdy okno ztratí zaměření, nebo použijte AppWindow.Changed k rozpoznání, kdy je minimalizované:

var m_window = App_Window;

void ReduceMemoryUsage() { }
void RestoreResources() { }

m_window.Activated += (sender, args) =>
{
    if (args.WindowActivationState == WindowActivationState.Deactivated)
    {
        // Window lost focus — consider reducing memory usage
        ReduceMemoryUsage();
    }
    else
    {
        // Window is active — reload resources
        RestoreResources();
    }
};

// To specifically detect minimize, use AppWindow.Changed
var appWindow = m_window.AppWindow;
appWindow.Changed += (sender, args) =>
{
    if (args.DidPresenterChange &&
        sender.Presenter is OverlappedPresenter presenter &&
        presenter.State == OverlappedPresenterState.Minimized)
    {
        // Window is minimized — reduce memory usage
        ReduceMemoryUsage();
    }
};

Co vydat

Pokud je okno skryté, zvažte uvolnění:

  • Obrázky a rastrové obrázky uložené v mezipaměti – Vyřaďte velké rastrové obrázky, které jsou potřeba jenom pro zobrazení.
  • Prostředky cíle vykreslování – Uvolněte prostředky GPU používané k vykreslování.
  • Data modelu zobrazení – Vymažte kolekce nebo data uložená v mezipaměti, která se dají znovu načíst, když se uživatel vrátí.
  • Historie navigace – Pokud má vaše aplikace navigační zásobník, vymažte stránky uložené v mezipaměti.
private System.Collections.Generic.List<object>? _imageCache;
private global::Microsoft.UI.Xaml.Window m_window = App_Window;

private void ReduceMemoryUsage()
{
    // Release cached images
    _imageCache?.Clear();

    // Clear navigation cache
    if (m_window.Content is Frame rootFrame)
    {
        rootFrame.CacheSize = 0;
    }

    // Hint the GC to collect if appropriate, without forcing a blocking collection.
    // Only call this in response to system memory pressure, not on every hide.
    GC.Collect(2, GCCollectionMode.Optimized, blocking: false);
}

private void RestoreResources()
{
    // Restore navigation cache
    if (m_window.Content is Frame rootFrame)
    {
        rootFrame.CacheSize = 10;
    }

    // Reload other resources as needed
}

Řešení nedostatku systémové paměti

Zaregistrujte se pro událost MemoryManager.AppMemoryUsageIncreased , abyste zjistili, kdy se zvýší zatížení systémové paměti:

void ReduceMemoryUsage() { }

Windows.System.MemoryManager.AppMemoryUsageIncreased += (sender, e) =>
{
    var level = Windows.System.MemoryManager.AppMemoryUsageLevel;

    if (level == Windows.System.AppMemoryUsageLevel.OverLimit ||
        level == Windows.System.AppMemoryUsageLevel.High)
    {
        ReduceMemoryUsage();
    }
};

Tip

I když systém desktopové aplikace automaticky neukončuje kvůli uvolnění paměti (na rozdíl od UWP), omezení využití paměti při nedostatku paměti pomáhá udržet systém pohotový a předcházet možným stavům nedostatku paměti.

Osvědčené postupy

  • Uvolněte, co můžete znovu načíst. Uvolňujte pouze prostředky, které můžete později znovu vytvořit z disku, sítě nebo pomocí výpočtu.
  • Postupně zmenšujte. Začněte tím, že nejprve uvolníte největší položky (obrázky, mezipaměti, kolekce dat).
  • Testujte na zařízeních s nedostatkem paměti. Ověřte, že správa paměti funguje na zařízeních s pamětí RAM o velikosti 4 GB nebo méně.
  • Neuchovávejte velké objekty ve statických proměnných. Místo toho používejte opožděné vzory načítání.