Die Unreal Engine 5 (UE5) erweitert die Möglichkeiten von Unreal Insights, indem sie die Memory Insights-Funktion um verbesserte Speicherverfolgung und Profiling Unterstützung ergänzt. Entwickler können nun mehr Informationen über Speicher und De-Allokation sehen, einschließlich der Low-Level Memory-Tags (LLM) und Callstacks, die mit jedem Block zu jedem Zeit assoziiert sind.
Memory Insights bietet eine Abfrage-Funktion, die Live-Allokationen zu einem bestimmten Zeitpunkt findet, Erhöhungen oder Verringerungen der Speicherverwendung erkennt, kurzfristige und langfristige Allokationen unterscheidet und Speicherlecks findet.
UE5.4 und später unterstützt Speicher-Tracing mit Callstacks für Android-Projekte.
Aufzeichnen einer Sitzung
Befolgen Sie diese Schritte, um Memory Insights für die Aufzeichnung einer Trace im Speicher zu verwenden:
Unreal Insights ausführen oder bauen
Navigieren Sie zu Start > Command Prompt und geben Folgendes ein:
Engine\Binaries\Win64\UnrealInsights.exeAlternativ können Sie zu Ihrem Ordner Engine\Binaries\Win64 navigieren und per Doppelklick UnrealInsights.exe ausführen.
Ausführen Ihres Spiel-Projekts mit Speicher-Tracing
Starten Sie die Eingabeaufforderung Ihres Systems und führen Sie Ihr Projektbeispiel aus:
cd C:\MyEngineInstallLocation\
Samples\Games\MyGameSample\Binaries\Win64\MyGameSample.exe -trace=default,memoryDie Aufzeichnung einer Sitzung Ihres Projekts erfordert, dass der Speicher Trace Kanal von Beginn des Prozesses an aktiv ist. Ansonsten ist es nicht möglich, in einer Lat-Connect Sitzung mit der Trace von Allokation -Events zu beginnen. Wenn Sie eine Trace für ein verpackt Projekt ausführen, müssen Sie außerdem sicherstellen, dass es im Entwicklungsmodus verpackt wird.
Sie können den Trace-Befehl Metadaten und Asset-Metadaten verwenden, um zusätzliche Filteroptionen für Asset- und Klassennamen bereitzustellen. Beispielsweise können Sie die Kosten der Allokation Speicher pro Asset oder pro Namen berechnen.
Samples\Games\MyGameSample\Binaries\Win64\MyGameSample.exe -trace=default,memory,metadata,assetmetadataÖffnen Sie Ihren Trace aus dem Insights-Sitzungsbrowser
Navigieren Sie zurück zum Unreal Insights-Sitzungsbrowser und doppelklicken Sie auf Ihre .utrace um sie für die Analyse im Timing Insights-Fenster der Unreal Engine zu öffnen. Wählen Sie Menu > Memory Insights, um das Fenster Memory Insights zu öffnen.
Speicherallokation – Diagramm Tracks
Unreal Insights erfasst komplette Callstacks für jedes Allokations-Event, um Ihnen eine Analyse des zugewiesenen Speichers Ihres Projekts zu bieten. Die Haupt-Interface für Memory Insights besteht aus einer Zeitleiste, die eine Übersicht der Speicherverwendung während der Sitzung anzeigt.
Das Hauptspeicherdiagramm zeigt die Gesamtmenge des verfolgten Speichers in Ihrem Projekt an, einschließlich Informationen zu jedem Tag, die vom LLM gesammelt wurden. Zusätzlich gibt es Diagramme, welche die Gesamtzahl der Live-Allokationen anzeigen:
| Diagrammtyp | Farbe | Beschreibung |
|---|---|---|
Total allokierter Speicher | Blau | Verfolgung die Gesamtmenge des allokierten Speichers zu jedem Zeitpunkt, basierend auf detaillierter Allokation. |
Live-Allokationsanzahl | Gelb | Zeigt die Gesamtzahl der aktiven Allokationen zu jedem Zeitpunkt an. |
Allokation/Freie Eventzahl | Grün/Orange | Zeigt die Anzahl der Allokation und freien Events pro Einheit, die als "Slice" an Zeit dargestellt wird. |
Jedes dieser Diagramme basiert auf einer detaillierten Verfolgung. Sie beginnen bei einem Wert von 0 und haben eine Granularität von etwa 1ms. Die anderen Diagramme mit den LLM Präfix-Tags (RenderTargets, SceneRender, UObject) basieren auf einem Low-Level-Speicherverfolgungs-System.
Diese Tags werden einige Sekunden nach Beginn der Sitzung mit der Verfolgung beginnen und enthalten eine Granularität pro Frame.
Standardmäßig geben wir bei jedem 4096-Zuweisungs-/Freigabeereignis einen Zeitstempel aus. Sie können diese Menge bei Bedarf ändern, indem Sie den MarkerSamplePeriod in Engine/Source/Runtime/Core/Private/ProfilingDebugging/MemoryAllocationTrace.cpp ändern. Wenn Sie diese Variable beispielsweise auf einen Wert von 0 einstellen, wird nach jeder Allokation / freien Event ein Zeitstempel ausgegeben.
Die Speicher Insights Zeitleiste unterstützt das Überlagern von Tracks auf der Timing-Ansicht. Bei der Verwendung der Speicher Insights-Ansicht stehen vier Panels zur Verfügung: das Timing-Panel, das Ermittlungs-Panel, das LLM Tags-Panel und das Modul-Panel.
Zeitsteuerungsansicht
Sie können auf Timing klicken, um die Anzeige des Timing-Ansicht-Fensters umzuschalten. Hier können Sie die Performance-Daten verschiedener Tracks bezüglich der Speicherverwendung beobachten und filtern.
Ermittlungs-Panel
Im Ermittlungs-Panel können Sie verschiedene Abfragen zu Allokationen stellen.
Low-Level-Memory(LLM)-Tags
Das LLM Tags Panel steuert die Sichtbarkeit verschiedener LLM Tags. Diese Daten werden direkt von Ihrem System getraced.
Sie können LLM-Tags, Assets und Quelldateien gruppieren. Zusätzlich können Sie im LLM Tags -Panel auf einen beliebigen LLM-Tag rechtsklicken und Generate a New Farbe oder Farbe bearbeiten auswählen, um die im angezeigte Farbe zu personalisieren.
Module
Sobald Aufrufstapel-Symbole aufgelöst werden, wird das Ergebnis in der Cache-Datei gespeichert. Sie können diese Dateien betrachten, indem Sie auf Module klicken. Durch dieses Panel können Sie alte Trace-Dateien öffnen und Symbole verwenden.
Sie können die Spalten für die Anzahl der Symbole betrachten, die Discovered, Cached, Resolved und Failed sind. Fehlgeschlagene Listenelemente werden in Rot hervorgehoben, und Listenelemente, die korrekt aufgelöst wurden, werden in Grün hervorgehoben. Gelb zeigt an, dass einige der Symbole aufgelöst haben und andere nicht.
Die vorherige Laufzeit-Implementierung der Speicherverfolgung wird in der Klasse LowLevelMemTracker implementiert, die sich im Ordner Engine\Source\Runtime\Core\Public\HAL\LowLevelMemTracker.h befindet. Sowohl das LLM Tags Panel als auch die LLM Diagramme verwenden Daten, die direkt aus diesem System stammen. Die detaillierten Allokationsdaten stammen aus einer separaten und spezifischen Trace-Implementierung.
Memory Insights enthält neue Speicher Abfragefunktionen und nachverfolgte Speicher Allokation Informationen. Sie können Speicherblöcke identifizieren, die UE5 in bestimmten Zeitfenstern vor oder nach einem bestimmten Zeitpunkt zuweist und freigibt, oder auf Speicherlecks prüfen. Sie können auf das Abfragesystem zugreifen, indem Sie nach Öffnen eines Trace-Log den Reiter Ermittlung aufrufen.
Die Statusleiste unten im Modul-Panel bietet Informationen über die Gesamtzahl und Größe der Module.
Methodik – Allokation-Queries
Die Zeitleiste bietet einen Überblick über die Speicherverwendung, aber die Bewertung des Verhaltens einzelner Allokationen über einen bestimmten Zeitraum hinweg erfolgt mithilfe von "Abfragen". Eine Abfrage wird durch eine Regel und einen oder mehr Zeitstempel definiert, etwa die Labels A und B.
Die verfügbaren Abfrageregeln lauten wie folgt:
| Abfrage Regel | Zeitvariable | Beschreibung |
|---|---|---|
Active Alloc | A | Zeigt alle aktiven Allokationen zum Zeitpunkt A an. |
Vorher | A | Zeigt alle Allokationen vor Zeit A an. |
Nachher | A | Zeigt alle Allokationen nach Zeit A an. |
Ablehnen | A und B | Zeigt alle Allokationen an, die vor Zeit A allokiert und zwischen Zeit A und Zeit B freigegeben wurden. |
Wachstum | A und B | Zeigt alle Allokationen an, die zwischen Zeit A und B allokiert und nach Zeit B freigegeben wurden. |
Wachstum vs. Zerfall | A und B | Identifiziert sowohl "Wachstums"-Allokationen (die zwischen Zeit A und Zeit B allokiert und nach Zeit B freigegeben werden) als auch "Abnahme"-Allokationen (vor Zeit A allokiert und zwischen Zeit A und Zeit B freigegeben). Die Abnahmezuweisungen werden so geändert, dass sie eine negative Größe haben, sodass die Größenaggregation Unterschiede zwischen A und B aufweist. Das Ergebnis dieser Abfrage ist ein Vergleich der Daten, die zum Zeit A zugewiesen wurden, mit den Daten, die zum Zeit B zugewiesen wurden. Eine Gruppierung von Speicherallokationen nach Tags oder Aufrufstapel zeigt die Variante (B – A) für jede Gruppe. |
Freie Events | A und B | Zeigt alle Allokationen an, die zwischen A und B freigegeben wurden. |
Alloc Events | A und B | Zeigt alle Allokationen an, die zwischen Zeit A und B allokiert wurden. |
Kurzlebige Zuordnungen | A und B | Zeigt alle Allokationen an, die nach Zeit A allokiert und vor Zeit B freigegeben wurden. Diese Regel kann verwendet werden, um Allokationen zu identifizieren, die Stapelallokationen sein könnten, was bedeutet, dass dies temporäre oder kurzlebige Allokationen identifiziert. |
Langlebige Zuordnungen | A und B | Zeigt alle Allokationen an, die vor Zeit A allokiert und nach Zeit B freigegeben wurden. |
Arbeitsspeicherverluste | A, B und C | Zeigt alle Allokationen an, die zwischen Zeit A und B allokiert und erst nach Zeit C freigegeben wurden. Das ist nützlich, um Speicher zu finden, der zu einem bestimmten Zeitpunkt freigegeben werden sollte, beispielsweise bei einem Levelübergang. |
Begrenzte Lebensdauer | A, B und C | Zeigt alle Zuordnungen an, die zwischen den Zeitpunkten A und B zugeordnet und zwischen den Zeitpunkten B und C freigegeben wurden. |
Abnahme langlebiger Zuordnungen | A, B und C | Zeigt alle Allokationen an, die vor der Zeit A allokiert und zwischen der Zeit B und C freigegeben wurden. |
Spezifische Lebenszeit | A, B, C und D | Zeigt alle Allokationen an, die zwischen Zeit A und B allokiert und zwischen Zeit C und D freigegeben wurden. |
Abfragen werden durchgeführt, indem Sie eine Regel auswählen und die beschrifteten Markierungen in der Zeitleiste an gewünschte Orte ziehen, oder indem Sie eine Zeit im Tab Ermittlung angeben.
Klicken Sie nach Auswahl der gewünschten Regeln und Zeiten auf die Schaltfläche Abfrage ausführen im Reiter Ermittlung, um die Abfrage durchzuführen.
Je nach Abfrage und dem aufgenommenen Datensatz kann die Ausführung der Abfragen eine beträchtliche Zeit in Anspruch nehmen.
Ansicht der Allokationsaufschlüsselung
Nach der Ausführung der Abfrage erscheint ein neues Fenster, nach Abschluss der Abfrage wird die Alloc-Tabelle mit dem Ergebnis bevölkert. Standardmäßig werden diese Ergebnisse in einer flachen Liste angezeigt.
Standardmäßig zeigt jede Allokation ihre eigenen an:
Python-Script ausführen
Größe
LLM-Tag
Funktion (Alloc)
Alloc-Aufrufstapel
Funktion (frei)
Freier Aufrufstapel
Sie können zusätzliche Parameter anzeigen, indem Sie auf das Tabellen-Heading rechtsklicken und unter Spaltensichtbarkeit Ihre gewünschten Einstellungen vornehmen. Sie können außerdem mit der Kugel über das Element links neben der Allokation hover, um zusätzliche Details anzuzeigen.
In der Statusleiste am unteren Bildschirmrand können Sie zusätzliche Details zu den ausgewählten Allokationen anzeigen lassen, darunter die Gesamtzahl und die Speichergröße.
Sortierung
Durch klicken auf die Tabellenüberschrift können Sie die Liste nach Spalten sortieren.
| Spalte sortieren | Beschreibung |
|---|---|
Zuordnungshierarchie | Sortiert nach der Hierarchie des Allokationbaums. |
Zuordnungsanzahl | Sortiert nach der Anzahl der Zuordnungen. |
Größe | Sortiert nach Größe der Allokationen. |
LLM-Tag | Sortiert nach LLM-Tag der Allokationen. |
Oberste Funktion (Aufrufstapel) | Sortiert nach der aufgelösten obersten Funktion aus dem Callstack der Zuordnungen. |
CallStack-Größe | Anzahl der Callstack-Frames. |
Gruppierung
Mit Voreinstellungs-Optionen können Sie Allokationen in Gruppe erstellen.
| Voreinstellung Option | Beschreibung |
|---|---|
Standard | Zeigt die Standard-Allokationen an |
Mit vielen Details | Konfiguriert die Baumansicht so, dass detaillierte Zuordnungsinformationen angezeigt werden. |
Heap | Untersucht, wie verschiedene Typen von Speicher verwendet werden. Siehe Multiple Address spaces. |
Größe | Finden Sie schnell große Allokationen. |
Tags | Zeigt die Allokationen pro System an. |
Asset (Paket) | Konfiguriert die Baumansicht so, dass eine Aufgliederung der Allokationen nach Paket- und Assetnamen-Metadaten angezeigt wird. |
Klassenname | Konfiguriert die Baumansicht so, dass Sie die Allokationen nach Klassenname sehen. |
Alloc-Aufrufstapel | Konfiguriert die Baumansicht, um eine Aufschlüsselung der Allokationen nach Aufrufstapel anzuzeigen. |
Umgekehrter Alloc-Aufrufstapel | Konfiguriert die Baumansicht, um eine Aufschlüsselung der Allokationen nach invertiertem Aufrufstapel anzuzeigen. |
Freier Aufrufstapel | Konfiguriert die Baumansicht so, dass eine Aufgliederung der Allokationen nach freiem Aufrufstapel angezeigt wird. |
Umgekehrter freier Aufrufstapel | Konfiguriert die Baumansicht, um eine Aufschlüsselung der Allokationen nach invertiertem Aufrufstapel anzuzeigen. |
Adresse (4k-Seite) | Gruppiert Allokationen basierend auf ihrer Adresse in 4k ausgerichtete Speicherseiten.
|
Navigieren Sie zu Hierarchie und klicken Sie auf Alle, um ein Dropdown-Liste Menü zu öffnen, in der Sie die standardmäßige flache Ansicht in zusätzliche, alternative Gruppen ändern können.
Sie können die Hierarchie aus der Liste der folgenden Optionen gruppieren.
| Hierarchiegruppe | Beschreibung |
|---|---|
Flat | Erstellt eine Gruppe, die alle Gegenstände umfasst. |
Größe | Gruppiert Zuweisungen auf Basis ihrer Größe. |
Tag | Erzeugt einen Baum auf der Grundlage der Tag-Hierarchie. |
Aufrufstapel | Erstellt einen Baum basierend auf dem Aufrufstapel jeder Allokation. |
Invertierter Aufrufstapel | Erstellt einen Baum basierend auf dem Aufrufstapel jeder Allokation. |
Heap | Erstellt einen Baum basierend auf Heap. Für Stamm-Heaps sind Untergruppen für Allocs und Heaps verfügbar. |
Einzigartige Werte – Event-Entfernung | Erstellt eine Gruppe für jeden Ereignisabstandswert. |
Einzigartige Werte – Startzeit | Erstellt eine Gruppe für jeden Start Time-Wert |
Einzigartige Werte – Endzeit | Erstellt eine Gruppe für jeden Wert Ende |
Eindeutige Werte – Dauer | Erstellt eine Gruppe für jeden Dauer-Wert |
Eindeutige Werte – Adresse | Erstellt eine Gruppe für jeden Adresse-Wert |
Einzigartige Werte – Speicherseite | Erstellt eine Gruppe für jeden Speicherseitenwert |
Eindeutige Werte – Größe | Erstellt eine Gruppe für jeden Größenwert |
Einzigartige Werte – LLM Tag | Erstellt eine Gruppe für jeden LLM-Tag-Wert |
Eindeutige Werte – Asset | Erstellt eine Gruppe für jeden Asset-Wert |
Eindeutige Werte – Klassenname | Erstellt eine Gruppe für jeden Klassenname-Wert |
Einzigartige Werte – Top–Funktion | Erstellt eine Gruppe für jeden Top-Wert |
Einzigartige Werte – Top Source Datei | Erstellt eine Gruppe für jeden Wert der obersten Quelldatei |
Einzigartige Werte – Aufrufstapel -Größe | Erstellt eine Gruppe für jeden Wert der Aufrufstapelgröße |
Pfad Breakdown – LLM Tag | Erstellt eine Baumhierarchie aus der Struktur von LLM-Tag-String-Werten. |
Pfad-Aufschlüsselung – Asset | Erstellt einen Baum-Hierarchie aus der Struktur von Asset-Tag String-Werten. |
Pfad Breakdown – Top Source Datei | Erstellt eine Baumhierarchie aus der Struktur der Top-Quelldatei-String-Werte. |
Erweiterte Filter
Das Suchtext-Box bietet eine Methode, um schnell Ergebnisse basierend auf dem Text des hierarchischen Knoten zu filtern. Die von der Abfrage produzierten Allokationen können weiter gefiltert werden, um eine Gruppe von Allokationen zu isolieren, indem Sie auf den Filterkonfigurator neben dem Suchtextfeld klicken.
Es ist möglich, erweiterte Abfragen mit Gruppen sowie und/oder Stichwörtern zu erstellen.
Symbolauflösung im Aufrufstapel
Das Aufrufstapel-Symboltracing aus Ihrem Projekt wird durch Verwendung von Programmzähleradressen erreicht. In der Analyse müssen diese Adressen zusammen mit Informationen über die entsprechenden Quelldateien in lesbare Strings aufgelöst werden.
Dazu muss Speicher Insights Zugang zu der korrekten Version der Datei mit den Debug-Informationen haben. entweder eine .pdb oder .elf Datei (abhängig von der Plattform). Insights sucht anhand der folgenden Liste nach der korrekten Datei:
Alle neuen Pfade, die der Nutzer in dieser Sitzung eingegeben hat.
Pfad der ausführbaren Datei (Falls auf einigen Plattformen verfügbar, wird dies in die Binärdatei kompiliert).
Pfade aus der Variable
UE_INSIGHTS_SYMBOLPATHder Umgebung. Diese Variable akzeptiert durch Semikolon getrennte Pfade.Pfade von
_NT_SYMBOL_PATH.Pfade aus der Nutzerkonfigurationsdatei.
Werden Symbole aufgelöst, werden die Ergebnisse in der Cache Datei gespeichert. Sie können diese Dateien anzeigen, indem Sie auf das Panel Module klicken. Sie können diese Dateien anschließend öffnen, indem Sie mit der rechten Maustaste auf die ausgewählte Datei klicken und in der Dropdown-Liste eine der folgenden Optionen auswählen.
Es bietet Ihnen eine Methode, die Trace-Datei an andere Nutzer zu senden, ohne dass diese Zugang zu diesen Debug-Informationen haben müssen.
| Load-Methode | Beschreibung |
|---|---|
Symbole aus Datei laden | Lädt Symbole für ein Modul durch Angabe einer Datei. Bei Erfolg wird versucht, andere fehlgeschlagene Module aus dem gleichen Verzeichnis zu laden. |
Laden Sie Symbole aus dem Verzeichnis | Lädt Symbole für ein Modul durch Angabe eines Verzeichnisses. Bei Erfolg wird versucht, andere fehlgeschlagene Module aus dem gleichen Verzeichnis zu laden. |
Die Auflösung von Symbolen ist derzeit für Win64, XB1/XSX, PS4/PS5 und Schalter verfügbar.
Mehrere Adressräume
Memory Tracing verfolgt den Speicher in verschiedenen Heaps. Jede Allokation muss zu einem Stamm-Heap gehören, der eine Art von Speicher repräsentiert. Auf Desktop-Plattformen ist beispielsweise ein Stamm-Heap der Arbeitsspeicher und der andere der Video-Speicher der Grafikkarte. Jeder Stamm-Heap hat seinen eigenen Adressraum. Unter jedem Stamm-Heap werden Heap-Allokationen vorgenommen, die Allokationen hosten können. Normalerweise handelt es sich dabei um virtuelle Speicher-Allokationen, die Allokationen sichern. Allerdings können Block-Allokatoren auch durch Heap-Allokationen repräsentiert werden. Dies ermöglicht die Untersuchung der Nutzung dieser Speicherblöcke.
Schnappschuss exportieren
Sie können Speicher-Allokationen als .csv- oder .tsv-Dateien exportieren, indem Sie rechtsklicken und Schnappschuss exportieren aus dem Kontextmenü auswählen.