Unreal Engine World Partition Convert Fix: Wie Sie unendliche Ladezeiten und Editor-Hangs beheben
Kurz und knapp
Dieser technische Guide beschreibt Lösungen für das Einfrieren des Editors bei der World-Partition-Konvertierung in der Unreal Engine. Die primäre Lösung besteht darin, den Konvertierungsprozess über das `WorldPartitionConvertCommandlet` in der Befehlszeile auszuführen, um den UI-Thread zu entlasten. Zusätzlich wird ein Python-Skript zur Pre-Flight-Validierung bereitgestellt, um problematische Actor-Koordinaten und Performance-Flaschenhälse vorab zu identifizieren.
Sie klicken im World-Partition-Menü auf „Convert“ und Ihr Unreal Engine Editor friert sofort ein. Der Fortschrittsbalken bleibt bei 0 % stehen, die CPU-Auslastung schnellt auf einem einzelnen Kern auf 100 % hoch und Ihre einzige Option ist es, den Prozess über den Task-Manager oder das Terminal hart zu beenden. Diese unendliche Ladeschleife während der Map-Konvertierung ist ein berüchtigter Roadblock für Teams, die Legacy-Maps oder großflächige Prototypen auf die moderne Spatial-Streaming-Architektur der Unreal Engine umstellen wollen. Während die Editor-UI die Konvertierung wie einen einfachen Klick aussehen lässt, löst dies bei komplexeren Levels eine Kaskade von synchronen Asset-Writes, Spatial-Grid-Allokationen und Package-Serialisierungsschleifen aus, die der Editor-Thread einfach nicht bewältigen kann.
Wenn Ihr Team Schwierigkeiten hat, den unreal engine world partition convert fix zu implementieren, liegt die Lösung darin, die Editor-UI komplett zu umgehen und Ihre Map-Assets programmatisch zu prüfen. Im Folgenden analysieren wir die technischen Ursachen hinter diesen Konvertierungsfehlern, zeigen Ihnen, wie Sie den Konvertierungsprozess mithilfe des Commandlet-Frameworks von Unreal sicher ausführen, und wie Sie Pre-Flight-Validierungsprüfungen automatisieren, um stundenlanges Debugging zu sparen.
Under the Hood: Warum die World-Partition-Konvertierung Ihren Editor einfrieren lässt
Um den Konvertierungs-Hang zu beheben, müssen Sie zunächst verstehen, was die Unreal Engine beim Auslösen der Konvertierung im Hintergrund tut. In einem Legacy-Level (.umap) werden alle Actor, Properties und Komponenten in ein einziges, massives, monolithisches Package serialisiert. World Partition ersetzt dies, indem es das Level in ein Spatial Grid aufteilt und jeden Actor mithilfe des One File Per Actor (OFPA)-Systems in einer eigenen, separaten Datei speichert.
Während der Konvertierung führt die Engine drei hochintensive Operationen durch, die häufig fehlschlagen:
1. Spatial-Hash-Grid-Allokation und der Infinite-Coordinate-Loop
Unreal Engine ordnet die Bounding Box jedes Actors einer Grid-Zelle zu. Standardmäßig verwendet World Partition eine Spatial-Grid-Größe von 25.600 Einheiten (256 Meter) pro Zelle. Wenn ein Actor – wie ein verwaistes Partikelsystem, ein UI-Helper-Actor oder ein falsch konfiguriertes Collision-Volume – an extremen Koordinaten platziert ist (z. B. X=2.000.000, Y=-5.000.000), versucht die Engine, Zell-Metadaten für jede Zelle zwischen dem Ursprung und diesem Actor zu generieren. Dies löst einen unendlichen Memory-Allocation-Loop aus, wodurch der Editor beim Versuch, Millionen von leeren Zellen zu partitionieren, einfriert.
2. Disk-Throttling und Verzeichnis-Sperren (OFPA)
Die Konvertierung einer Map mit 15.000 Actor bedeutet, dass die Engine 15.000 einzelne .uasset-Dateien im ExternalActors-Verzeichnis erstellen muss. Im Editor läuft dieser Prozess synchron auf dem Main-Thread. Wenn Sie eine aktive Versionskontroll-Integration (wie Perforce oder Git) oder einen Echtzeit-Antivirenscanner auf Ihren Projektverzeichnissen aktiv haben, wird jeder Schreibvorgang abgefangen. Das Betriebssystem sperrt die File-Handles und zwingt den Editor-Thread zum Warten, was sich als unendlicher Freeze äußert.
3. Speicherüberlastung und Fehler bei der Package-Serialisierung
Während der Konvertierung lädt der Editor alle referenzierten Blueprints, Static Meshes und Texturen in den Arbeitsspeicher, um die Bounds neu zu berechnen und saubere Actor-Packages zu schreiben. Ohne ausreichend RAM geht der Engine der physische Speicher aus, und sie gerät durch starkes Disk-Paging ins Stocken. Darüber hinaus können ungelöste zirkuläre Abhängigkeiten oder fehlerhafte Blueprints zu schweren Packaging-Crashes führen, ähnlich dem Unreal Package HasValidBlueprint Ensure Crash, was den Serialization-Worker abrupt stoppt.
Step-by-Step Fix 1: Commandlet-basierte Konvertierung (Der sichere Weg)
Konvertieren Sie mittlere bis große Maps niemals über die Unreal Editor-UI. Nutzen Sie stattdessen das WorldPartitionConvertCommandlet. Die Ausführung der Konvertierung über die Befehlszeile isoliert den Prozess vom UI-Thread des Editors, ermöglicht der Engine eine effizientere Garbage Collection des Speichers und liefert Echtzeit-Logs in Ihrem Terminal, sodass Sie genau sehen können, welcher Actor einen Hang verursacht.
Erstellen Sie ein Bash-Skript (convert_map.sh) oder ein Windows-Batch-Skript (convert_map.bat) in Ihrem Projektordner. Hier ist das robuste, von Entwicklern bewährte Skript für Windows:
@echo off
SET "UNREAL_ENGINE_PATH=C:\Program Files\Epic Games\UE_5.5\Engine\Binaries\Win64\UnrealEditor-Cmd.exe"
SET "PROJECT_PATH=D:\Projects\MyGame\MyGame.uproject"
SET "MAP_NAME=/Game/Maps/Campaign_Main"
echo Starting World Partition Conversion for %MAP_NAME%...
"%UNREAL_ENGINE_PATH%" "%PROJECT_PATH%" ^
-run=WorldPartitionConvertCommandlet ^
"%MAP_NAME%" ^
-AllowCommandletRendering ^
-Force ^
-Verbose ^
-stdout ^
-unattended ^
-NoShaderCompile ^
-LOG=WorldPartitionConversion.log
if %ERRORLEVEL% NEQ 0 (
echo Conversion failed! Check Saved\Logs\WorldPartitionConversion.log
exit /b %ERRORLEVEL%
)
echo Conversion completed successfully!
Die wichtigsten Commandlet-Flags erklärt:
UnrealEditor-Cmd.exe: Verwenden Sie immer die Command-Line-Executable anstelle der standardmäßigenUnrealEditor.exe. Sie gibt Logs direkt an stdout aus und beendet sich sofort nach Abschluss.-AllowCommandletRendering: Zwingt die Engine, Rendering-Ressourcen zu initialisieren. Dies verhindert Hangs, wenn Ihre Map Actor oder Komponenten enthält, die während der Serialisierung GPU-Bounds-Berechnungen oder Material-Kompilierung erfordern.-Force: Weist den Converter an, alle vorhandenen External-Actor-Assets zu überschreiben. Dies ist wichtig, wenn ein vorheriger Konvertierungsversuch mittendrin abgebrochen wurde und beschädigte Assets imExternalActors-Verzeichnis hinterlassen hat.-unattended: Unterdrückt alle modalen Popups und Dialogfelder. Ohne dieses Flag könnte die Konvertierung stillschweigend im Hintergrund stoppen, während sie darauf wartet, dass Sie bei einer Warnung zu Asset-Referenzen auf „OK“ klicken.-NoShaderCompile: Verhindert, dass der Shader-Compiler Threads startet, was während der Konvertierung erheblich CPU- und Speicher-Overhead spart.
Step-by-Step Fix 2: Pre-Flight Python-Verifizierungsskript
Das Konvertierungsskript blind auszuführen kann dennoch scheitern, wenn Ihre Map fehlerhafte Daten enthält. Um den Erfolg zu garantieren, nutzen Sie das folgende Skript, um Ihr Map-Package vor der Ausführung des Converters zu prüfen. Dieses Python-Skript läuft im Unreal Editor (stellen Sie sicher, dass das Python Editor Script Plugin aktiviert ist) und sucht nach extremen Koordinaten, Null-Actorn und hochdichten Komponenten, die den Serialisierungsprozess üblicherweise blockieren.
Speichern Sie dieses Skript als wp_preflight_check.py und führen Sie es über die Python-Konsole aus oder ziehen Sie es einfach in das Editor-Fenster:
import unreal
def validate_map_for_world_partition(map_path, max_boundary_cm=1000000.0):
"""
Validates a monolithic map asset before converting it to World Partition.
Scans for null references, extreme actor coordinates, and component counts.
"""
# Initialize the asset registry to find the target level
asset_registry = unreal.AssetRegistryHelpers.get_asset_registry()
map_asset = asset_registry.get_asset_by_object_path(unreal.SoftObjectPath(map_path))
if not map_asset:
unreal.log_error(f"[PREFLIGHT] Map asset not found at path: {map_path}")
return False
unreal.log(f"[PREFLIGHT] Loading map package to analyze: {map_path}")
world = unreal.EditorLoadingAndSavingUtils.load_map(map_path)
if not world:
unreal.log_error("[PREFLIGHT] Failed to load the map package into the editor context.")
return False
# Query all actors currently present in the persistent level
actors = unreal.GameplayStatics.get_all_actors_of_class(world, unreal.Actor)
total_actors = len(actors)
unreal.log(f"[PREFLIGHT] Analyzing {total_actors} actors for potential conversion hazards...")
invalid_actors = 0
out_of_bounds_actors = []
heavy_components_actors = []
for actor in actors:
if not actor or not actor.is_valid():
invalid_actors += 1
continue
actor_name = actor.get_actor_label()
# 1. Coordinate Boundary Checks (Detects spatial grid loops)
location = actor.get_actor_location()
if (abs(location.x) > max_boundary_cm or
abs(location.y) > max_boundary_cm or
abs(location.z) > max_boundary_cm):
out_of_bounds_actors.append((actor_name, location))
# 2. Check for component bloat that leads to serialization hangs
components = actor.get_all_child_actors(True)
if len(components) > 150:
heavy_components_actors.append((actor_name, len(components)))
# Compile the pre-flight report
unreal.log("------------------ PRE-FLIGHT REPORT ------------------")
unreal.log(f"Total Actors Audited: {total_actors}")
success = True
if invalid_actors > 0:
unreal.log_error(f"[FAIL] Found {invalid_actors} invalid/corrupted actors. Clean up your map hierarchy first.")
success = False
else:
unreal.log("[PASS] No corrupted actors found.")
if out_of_bounds_actors:
unreal.log_warning(f"[WARN] Found {len(out_of_bounds_actors)} actors at extreme coordinates. These will cause infinite spatial grid loops:")
for name, loc in out_of_bounds_actors:
unreal.log_warning(f" -> Actor: '{name}' is at X={loc.x:.1f}, Y={loc.y:.1f}, Z={loc.z:.1f}")
success = False
else:
unreal.log("[PASS] All actors lie within reasonable spatial boundaries.")
if heavy_components_actors:
unreal.log_warning(f"[WARN] Found {len(heavy_components_actors)} actors with high child/component density:")
for name, count in heavy_components_actors:
unreal.log_warning(f" -> Actor: '{name}' has {count} children (consider merging or nesting)")
unreal.log("-------------------------------------------------------")
return success
# Execute validation on your target map path
# Example: validate_map_for_world_partition("/Game/Maps/Campaign_Main")
Behebung von Disk-I/O-Blockaden und Versionskontroll-Sperren
Wenn die Python-Prüfung erfolgreich ist und das Commandlet immer noch hängt, liegt das Problem an der Umgebung. Die World-Partition-Konvertierung erstellt in wenigen Sekunden Tausende von physischen Asset-Dateien in Ihrer Verzeichnisstruktur.
Um Probleme mit blockierten Datenträgern zu beheben:
- Projektverzeichnisse vom Echtzeitschutz ausschließen: Öffnen Sie die Windows-Sicherheit (oder Ihre Antiviren-Suite) und fügen Sie Ihren Projekt-Root-Ordner zur Ausschlussliste hinzu. Echtzeit-Virenscanner versuchen, jede einzelne
.uasset-Datei zu überprüfen, sobald sie in dasExternalActors-Verzeichnis geschrieben wird. Dies blockiert die Disk-Queue vollständig und führt zu Timeouts beim Unreal-Asset-Writer. - Versionskontroll-Plugins temporär deaktivieren: Benennen Sie vor dem Ausführen des Konvertierungsskripts die
.uplugin-Dateien temporär um oder deaktivieren Sie Perforce/Git in Ihrer Editor-Konfiguration. Sobald die Map erfolgreich konvertiert wurde, können Sie das Versionskontroll-Plugin wieder aktivieren, das neueExternalActors-Verzeichnis zu Ihrer Changelist hinzufügen und committen. - Mit Administratorrechten ausführen: In einigen Unternehmens-Entwicklungsumgebungen verhindern Schreibbeschränkungen für Verzeichnisse, dass Commandlets spontan Unterverzeichnisse erstellen, was zu stillen Schreibfehlern und Thread-Hangs führt.
Skalierung auf riesige Welten: Die Backend-Dimension
Die Konvertierung Ihrer Map in World Partition ist der erste Schritt zur Bewältigung riesiger Koordinaten und hochdetaillierter Szenen. Allerdings bringt der Betrieb eines Large-World-Spiels neue Herausforderungen für Ihre Multiplayer-Infrastruktur mit sich.
Wenn Ihre Spielwelt mehrere Quadratkilometer umfasst, kann eine einzelne Dedicated Server-Instanz Replikation, Collision und Physik nicht mehr effizient für jeden Spieler verarbeiten. Um die Serverleistung aufrechtzuerhalten, müssen Entwickler nicht benötigte Assets auf dem Server entfernen – ein Prozess, der in unserem Guide über dedicated server asset stripping im Detail beschrieben wird.
Selbst mit Asset-Stripping erfordert eine riesige Welt irgendwann Server-Zoning und nahtlose Spielerübergänge. Der Aufbau eines verteilten Server-Backends, das dynamische Server-Allokation, Matchmaking über Zonen hinweg und Echtzeit-Datenbanksynchronisierung bewältigt, ist ein gewaltiges Unterfangen. Entwickler verbringen oft Monate damit, eigene Load Balancer, Session-Manager und Pipelines zur Datenbanksynchronisierung zu schreiben, um Lobbys in großem Maßstab zu unterstützen.
Hier kommt horizOn ins Spiel, das ein vorkonstruiertes, sofort einsatzbereites Backend-as-a-Service bietet, das speziell für Multiplayer-Spieleentwickler konzipiert ist. Indem unsere Plattform Spieler-Persistenz, Session-Management mit niedriger Latenz und serverseitige Statussynchronisierung automatisch übernimmt, kann sich Ihr Team auf die Entwicklung von Gameplay-Systemen und die Optimierung der Client-Performance konzentrieren, anstatt die Infrastruktur zu debuggen.
Best Practices für World-Partition-Konvertierungen
Befolgen Sie diese 4 praxiserprobten Richtlinien, um reibungslose Map-Konvertierungen zu gewährleisten und Regressionen zu vermeiden:
- Definieren Sie zuerst explizite Level-Bounds: Platzieren Sie vor der Konvertierung immer einen
ALevelBounds-Actor in Ihrer Map. Dies liefert dem World Partition Builder eine präzise Bounding Box für den Spatial Hash und verhindert, dass der Generator verwaiste Assets an unendlichen Koordinaten analysiert. - Bereinigen Sie zirkuläre Blueprint-Abhängigkeiten: Stellen Sie sicher, dass Ihre Level-Blueprints keine engen Casting-Abhängigkeiten zu Actorn aufweisen, die in externe Dateien konvertiert werden. Zirkuläre Abhängigkeiten zwingen das Packaging-Tool dazu, Packages mitten in der Serialisierung neu zu laden, was häufig zu Memory Leaks und Konvertierungs-Hangs führt.
- Führen Sie Konvertierungen in einem sauberen Engine-Zustand durch: Starten Sie Ihr System immer neu oder löschen Sie den Shader-Cache und den
DerivedDataCache(DDC), bevor Sie riesige Levels konvertieren. Dies gibt System-RAM frei und stellt sicher, dass sich das Commandlet nicht an veralteten gecachten Assets verschluckt. - Isolieren Sie das ExternalActors-Verzeichnis in Git/Perforce: Stellen Sie sicher, dass Ihre
.gitignore- oder.p4ignore-Dateien so konfiguriert sind, dass temporäre Sperrdateien ignoriert werden, während die imExternalActors-Verzeichnis generierten.uasset-Dateien erfasst werden.
Bereit, Ihr Multiplayer-Backend zu skalieren?
Indem Sie Ihre Konvertierungen über Commandlets ausführen und Actor-Positionen programmatisch überprüfen, können Sie Editor-Hangs einfach umgehen und mit der Entwicklung Ihres Spiels fortfahren. Sobald Ihre riesigen Levels partitioniert und optimiert sind, besteht der nächste Schritt darin, sicherzustellen, dass Ihr Backend der Last standhält.
Anstatt Wochen mit der Einrichtung von individuellem Matchmaking, Lobby-Systemen und Spielerstatus-Replikation zu verbringen, überlassen Sie horizOn die Arbeit. Testen Sie es noch heute kostenlos oder lesen Sie die API-Docs, um zu sehen, wie einfach die Integration in Ihr Unreal Engine-Projekt ist.
Quelle: Convert map to world partition not working unreal engine 5.7.4