Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í.
Související obsah
Windows developer