Jak opanować Asset Stripping w Unreal Engine Dedicated Server (Krok po kroku)
Uruchamiasz swój nowo skompilowany Unreal Engine dedicated server, spodziewając się lekkiego procesu headless. Sprawdzasz memory profile i oto one: tysiące obiektów UMaterial, UTexture i USoundWave zalegających w pamięci RAM serwera.
Oficjalna dokumentacja twierdzi, że serwer headless nie renderuje grafiki. Dlaczego więc Twój serwer marnuje megabajty na dane tekstur?
Każdy twórca indie zna ten moment, gdy koszty hostingu zaczynają zagrażać budżetowi projektu. Gdy maszyna bare-metal może pomieścić tylko 10 instancji gry zamiast 50 z powodu memory bloat, Twoja architektura backendu jest zagrożona.
W tym artykule przeanalizujemy, jak naprawdę działa unreal engine dedicated server asset stripping, dlaczego ghost assets pozostają w pamięci i jak zaprojektować C++ oraz Blueprinty, aby całkowicie je wyeliminować.
Anatomia "Ghost Asset" na Dedicated Server
Aby rozwiązać problem, musisz zrozumieć, co robi Unreal Automation Tool (UAT) podczas cookowania dla targetu Server.
Silnik Unreal dzieli assety na dwie części:
- UObject Wrapper: Metadane, właściwości i dane refleksji.
- Bulk Data: Właściwe dane (skompresowane piksele DXT dla tekstur, vertex buffers dla meshy, dane PCM dla audio).
Podczas cookowania dedicated server, cooker skutecznie usuwa bulk data. Dane renderowania znikają. Jednak UObject wrapper pozostaje.
Jeśli Blueprint Class Default Object (CDO) posiada hard reference do UTexture2D, serwer musi zainicjować obiekt UTexture2D, aby zadowolić system refleksji i uniknąć crashy. Nawet jeśli bulk data zostało usunięte i tekstura zajmuje 1KB zamiast 10MB, narzut związany z instancjonowaniem 50 000 takich obiektów prowadzi do znaczącego memory bloat i obciążenia Garbage Collection.
Czy Audio i Particle działają tak samo?
Tak. Hard reference do USoundCue lub UNiagaraSystem spowoduje załadowanie obiektu. Dane PCM zostaną usunięte, ale obiekt nadal istnieje. W przypadku systemów cząsteczek jest to niebezpieczne – jeśli zawierają logikę CPU, serwer może ją niepotrzebnie przetwarzać (tick), zużywając cykle procesora.
Krok 1: Profilowanie Memory Bloat serwera
Nie możesz optymalizować czegoś, czego nie potrafisz zmierzyć. Uruchom serwer z argumentami:
-LLM -LLMCSV -memoryprofiler
W konsoli serwera wykonaj polecenie memreport -full. W pliku raportu szukaj sekcji Obj List. Zobaczysz tam listę obiektów i ich rozmiar w RAM.
Krok 2: Zrywanie Hard References za pomocą Soft Pointers
Główną przyczyną ghost assets są hard references. W C++ używaj TSoftObjectPtr. Soft references przechowują tylko ścieżkę do assetu, a obiekt jest ładowany do pamięci dopiero po wywołaniu LoadSynchronous() (co powinieneś robić tylko na kliencie).
DOBRZE: Soft Reference (Serwer pozostaje czysty)
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI")
TSoftObjectPtr<UTexture2D> HeroPortraitSoft;
Krok 3: Wymuszanie NeedsLoadForServer
Możesz nakazać systemowi pakowania całkowite ignorowanie komponentów wizualnych na serwerze, nadpisując funkcję NeedsLoadForServer i zwracając false.
Krok 4: Stripping Audio i Partikli przez konfigurację
W pliku DefaultEngine.ini możesz wykluczyć całe foldery z procesu cookowania dla serwera za pomocą +DirectoriesToNeverCook. Dodatkowo, w pliku *.Target.cs serwera możesz ustawić bDisableAudio = true;.
Najlepsze praktyki
- Oddziel Collision Meshes od Visual Meshes: Serwer powinien ładować tylko uproszczone dane kolizji.
- Audyt Construction Scripts: Używaj
Switch Has Authority, aby serwer pomijał logikę wizualną. - Izolacja Data Assets: Rozdziel dane statystyk od danych wizualnych.
- Automatyzacja w CI/CD: Sprawdzaj zużycie pamięci przy każdym buildzie.
Skalowanie zoptymalizowanego backendu
Zmniejszenie zużycia RAM z 800MB do 180MB to ogromny sukces. Pozwala to na uruchomienie 4-5 razy więcej instancji gry na tym samym serwerze, drastycznie redukując koszty hostingu.
Zamiast tracić miesiące na budowanie własnej infrastruktury do orkiestracji, skorzystaj z horizOn. Wgraj swój zoptymalizowany build Linux, a my zajmiemy się auto-scalingiem i globalną flotą.
Podsumowanie
Asset stripping w Unreal Engine zależy od Twojej architektury. Stosując soft pointers i oddzielając dane wizualne od gameplayu, osiągniesz wydajność niezbędną w grach multiplayer.
Gotowy na skalowanie? Wypróbuj horizOn za darmo lub sprawdź naszą dokumentację API.