Powrót do Bloga

Naprawa crashu Unreal Engine 5.8 na systemach Linux: Workaround dla segfaulta CEF i NSS PKCS#11

Opublikowano 1 lipca 2026
Naprawa crashu Unreal Engine 5.8 na systemach Linux: Workaround dla segfaulta CEF i NSS PKCS#11 Wygenerowano przy użyciu AI

W skrócie

Artykuł szczegółowo analizuje przyczynę natychmiastowego crashu edytora Unreal Engine 5.8 przy starcie na systemach Linux, wskazując na kolizję symboli OpenSSL wywołaną przez biblioteki CEF i NSS PKCS#11. Przedstawiono trzy praktyczne sposoby rozwiązania problemu (workarounds), w tym wyłączenie ładowania modułów PKCS#11 oraz pominięcie inicjalizacji CEF. Dodatkowo opisano automatyzację naprawy za pomocą skryptu startowego typu wrapper oraz implementację poprawki bezpośrednio w kodzie C++ silnika. Jako długofalowe rozwiązanie architektoniczne zasugerowano rozdzielenie uwierzytelniania klienta od ciężkich komponentów webowych za pomocą dedykowanych platform API-first.

Rozwiązanie crashu Unreal Engine 5.8 przy starcie na systemach Linux wymaga przyjrzenia się dynamic linkerowi, bibliotekom systemowym oraz Chromium Embedded Framework (CEF). Podczas uruchamiania Unreal Engine 5.8 na najnowszych dystrybucjach systemu Linux, takich jak Debian 13 (Trixie), Fedora 40 czy Ubuntu 24.04, deweloperzy często napotykają na natychmiastowy crash podczas inicjalizacji edytora. Dzieje się to dokładnie w punkcie przejścia między engine preloaderem a oknem Welcome Window edytora, zwracając krytyczny błąd Caught signal 11 (Segmentation fault).

Główną przyczyną nie jest błąd w rdzeniu C++ rendering pipeline silnika, lecz kolizja symboli bibliotek dynamicznych (dynamic library symbol collision) pomiędzy wbudowanym stosem sieciowym Chromium Embedded Framework (CEF) a systemowym interfejsem kryptograficznym kart inteligentnych (PKCS#11/OpenSC). Kiedy CEF inicjalizuje swoje procedury bezpiecznego połączenia, ładuje konfigurację Network Security Services (NSS) systemu operacyjnego. Konfiguracja ta wczytuje zewnętrzne biblioteki dynamiczne, które linkują się z wersją OpenSSL zainstalowaną w systemie. Ponieważ Unreal Engine zmapował już własne, niestandardowe symbole OpenSSL w global namespace, dynamic linker rozwiązuje wywołania kryptograficzne systemu operacyjnego za pomocą wewnętrznych symboli Unreal Engine, co prowadzi do memory corruption i crashu.

Ten przewodnik zawiera szczegółową analizę mechanizmu crashu, analizuje stack trace, wyjaśnia, dlaczego zachowanie to różni się od poprzednich wersji silnika, oraz przedstawia trzy różne workarounds pozwalające przywrócić stabilność.


The Crash: Co się dzieje przy starcie Unreal Engine 5.8 na Linuxie

Proces startowy i Signal 11

Podczas standardowego procesu startowego Unreal Engine, silnik inicjalizuje kluczowe globalne podsystemy: Task Graph, memory allocatory oraz domyślne pluginy projektu. Po załadowaniu głównych modułów silnik próbuje wyświetlić interfejs edytora. Jeśli projekt wymaga uwierzytelnienia lub korzysta z Epic Online Services, edytor uruchamia FWebBrowserViewport w celu wyrenderowania panelu logowania oraz Welcome Screen.

Moduł WebBrowser bazuje na dołączonym, prekompilowanym buildzie Chromium Embedded Framework (CEF), który znajduje się w katalogu silnika Engine/Binaries/ThirdParty/CEF3/Linux/. Gdy CEF inicjalizuje swój network manager, odwołuje się do systemowej biblioteki Network Security Services (NSS) (libnss3.so), aby zarządzać certyfikatami, tożsamościami kryptograficznymi oraz łańcuchami zaufania (trust chains). W nowoczesnych konfiguracjach systemu Linux, NSS odczytuje systemową konfigurację PKCS#11 i automatycznie próbuje załadować moduł sterownika OpenSC PKCS#11 (onepin-opensc-pkcs11.so).

W momencie, gdy moduł ten jest ładowany za pomocą dlopen(), dynamic linker próbuje rozwiązać zależne symbole modułu. Z powodu kolizji w globalnej tabeli wyszukiwania symboli (global symbol lookup table), aplikacja natychmiast się crashuje.

Oto typowy log z terminala przedstawiający ten konkretny błąd:

LogHAL: Child-inherited environment variables:
LogInit: Display: Project file: /home/user/projects/MyGame/MyGame.uproject
LogInit: Display: SandboxEnabled: 1
LogWebBrowser: Display: Initializing WebBrowser...
LogWebBrowser: Display: CEF version: 124.0.0
LogInit: Display: Starting Welcome Window...
Signal 11 caught.
Engine crash handling finished; exiting.
Caught signal 11 (Segmentation fault)

Analiza stack trace i środowiska systemowego

Debugowanie tego crashu pod debuggerem takim jak GDB lub LLDB ujawnia jasny łańcuch zdarzeń. Crash nie pochodzi z game threada ani rendering threadów silnika, ale z worker threada utworzonego przez CEF na potrzeby operacji sieciowych.

Oto szczegółowy stack trace z debuggera GDB podczas crashu:

Thread 12 "CEFNetworkThread" received signal SIGSEGV, Segmentation fault.
0x00007ffff01a2c3d in ?? () from /lib/x86_64-linux-gnu/libcrypto.so.3
(gdb) bt
#0  0x00007ffff01a2c3d in ?? () from /lib/x86_64-linux-gnu/libcrypto.so.3
#1  0x00007ffff018a3ef in CRYPTO_THREAD_lock_new () from /lib/x86_64-linux-gnu/libcrypto.so.3
#2  0x00007ffff12c8a14 in ?? () from /usr/lib/x86_64-linux-gnu/pkcs11/onepin-opensc-pkcs11.so
#3  0x00007ffff12a7d83 in C_Initialize () from /usr/lib/x86_64-linux-gnu/pkcs11/onepin-opensc-pkcs11.so
#4  0x00007fffe8c93a02 in ?? () from /home/user/UnrealEngine-5.8/Engine/Binaries/ThirdParty/CEF3/Linux/libcef.so
#5  0x00007fffe8c94215 in ?? () from /home/user/UnrealEngine-5.8/Engine/Binaries/ThirdParty/CEF3/Linux/libcef.so
#6  0x00007fffe8ca1b94 in ?? () from /home/user/UnrealEngine-5.8/Engine/Binaries/ThirdParty/CEF3/Linux/libcef.so
#7  0x00007ffff7fa239d in start_thread (arg=0x7fffd9dfb700) at pthread_create.c:477
#8  0x00007ffff7ebd4bf in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Stack trace ujawnia bezpośredniego winowajcę:

  1. libcef.so inicjalizuje stos sieciowy.
  2. Żąda od NSS załadowania listy modułów PKCS#11.
  3. NSS inicjalizuje sterownik OpenSC PKCS#11 poprzez C_Initialize.
  4. onepin-opensc-pkcs11.so próbuje utworzyć kryptograficzny mutex lock za pomocą funkcji OpenSSL CRYPTO_THREAD_lock_new.
  5. Odczyt pamięci wewnątrz dynamicznie linkowanego modułu OpenSSL natychmiast kończy się crashem z powodu niepoprawnych struktur.

Ten błąd nie występuje w Unreal Engine 5.6.1. Na tym samym systemie Unreal Engine 5.6.1 omija lub bezproblemowo obsługuje ten krok ze względu na różnice w flagach kompilacji, wersjach OpenSSL oraz sposobie izolacji zależności.


Zrozumieć przyczynę: Piekło bibliotek współdzielonych na Linuxie (Shared Library Hell)

Rola CEF i NSS

Do renderowania komponentów webowego interfejsu użytkownika Unreal Engine wykorzystuje Chromium Embedded Framework (CEF), czyli framework zbudowany na bazie silnika przeglądarki Chromium. CEF to złożona zależność, która do działania wymaga standardowych bibliotek UI oraz bibliotek bezpieczeństwa systemu Linux. Wśród tych zależności znajduje się Network Security Services (NSS) – zestaw bibliotek zaprojektowany w celu wspierania wieloplatformowego tworzenia bezpiecznych aplikacji klienckich i serwerowych.

NSS korzysta z architektury modułowej. Nie wykonuje wszystkich zadań kryptograficznych wewnętrznie, lecz polega na zewnętrznych dostawcach usług kryptograficznych (cryptographic providers) zgodnych ze standardem PKCS#11. Podczas inicjalizacji NSS odczytuje systemową bazę danych (często zlokalizowaną w /etc/pkcs11/modules/ lub lokalnym katalogu użytkownika ~/.pki/nssdb), aby załadować moduły takie jak sterowniki kart inteligentnych, sprzętowe klucze bezpieczeństwa czy mostki TPM. W nowoczesnych instalacjach Linuxa biblioteka OpenSC rejestruje domyślny moduł PKCS#11 (np. onepin-opensc-pkcs11.so lub opensc-pkcs11.so), aby udostępnić autoryzację kartami inteligentnymi dla przeglądarek internetowych.

Kolizja symboli OpenSSL

Podczas kompilacji aplikacji deweloper może zdecydować, w jaki sposób linkować zewnętrzne biblioteki. Unreal Engine jest kompilowany z dołączoną wersją OpenSSL (libcrypto.so i libssl.so). Ponieważ silnik bazuje na określonych zachowaniach OpenSSL, zawiera te biblioteki w swojej ścieżce instalacyjnej i ładuje je dynamicznie podczas uruchamiania, umieszczając wyeksportowane symbole w globalnej tabeli wyszukiwania symboli procesu.

Gdy dynamic loader (ld.so) przetwarza żądanie załadowania biblioteki dynamicznej za pomocą dlopen(), sprawdza nierozwiązane symbole nowo załadowanej biblioteki. Kiedy NSS ładuje systemowy plik onepin-opensc-pkcs11.so, moduł ten odpytuje o symbole systemowe OpenSSL. Ponieważ Unreal Engine zapełnił już globalną przestrzeń symboli własną wersją OpenSSL, dynamic loader kieruje moduł PKCS#11 do wewnętrznych symboli OpenSSL Unreal Engine, zamiast do biblioteki libcrypto.so.3 systemu operacyjnego.

Poniższa tabela ilustruje różnice konfiguracyjne między systemem operacyjnym a środowiskiem silnika:

Atrybut Host Linux System Wbudowany w Unreal Engine 5.8
Wersja OpenSSL 3.2.x lub 3.3.x (Debian 13) 3.1.2-u1 (Custom Engine Build)
Typ linkowania Shared System Libraries Shared Engine-Private Libraries
Wersja NSS 3.98+ (System) Bundled via CEF 124
Zakres symboli (Symbol Scope) Local Namespace Global Process Namespace (RTLD_GLOBAL)

Ponieważ wewnętrzna wersja OpenSSL silnika nie odpowiada dokładnemu rozmiarowi struktur, wyrównaniu (alignment) oraz wewnętrznemu stanowi inicjalizacji systemowego OpenSSL na hoście, biblioteka PKCS#11 odczytuje uszkodzone lub nieprawidłowo wyrównane offsety pamięci podczas wywoływania CRYPTO_THREAD_lock_new. Prowadzi to bezpośrednio do segmentation fault.


Instrukcja krok po kroku: Workarounds naprawiające startowy segfault

Deweloperzy tworzący gry na systemy Linux potrzebują przewidywalnych środowisk deweloperskich. Możesz rozwiązać ten crash przy starcie, modyfikując sposób, w jaki proces silnika wchodzi w interakcję z systemowymi konfiguracjami PKCS#11 oraz NSS.

Workaround 1: Pominięcie ładowania modułu PKCS#11

Najbardziej bezpośrednią i najmniej inwazyjną metodą jest poinstruowanie NSS, aby całkowicie pominęło ładowanie modułów PKCS#11. Ponieważ edytory do developmentu gier rzadko wymagają uwierzytelniania kartami inteligentnymi, wyłączenie tej funkcji nie ma żadnych skutków ubocznych dla działania edytora.

Możesz wyłączyć ładowanie modułów PKCS#11 poprzez ustawienie zmiennej środowiskowej NSS_DISABLE_PKCS11. Przed uruchomieniem edytora wykonaj w terminalu następujące polecenie:

export NSS_DISABLE_PKCS11=1
./Engine/Binaries/Linux/UnrealEditor

Ta zmienna środowiskowa zmusza procedury inicjalizacyjne NSS do zignorowania plików konfiguracyjnych kart inteligentnych w systemie, co zapobiega ładowaniu onepin-opensc-pkcs11.so. Jeśli stosujesz już stripping assetów dla headless builds, sprawdź nasz poradnik Unreal Engine Dedicated Server Asset Stripping, aby Twoje serwery Linux pozostały lekkie i wolne od crashów.

Workaround 2: Nadpisanie konfiguracji OpenSC

Jeśli nie możesz wyłączyć PKCS#11 w całym systemie, ponieważ inne komponenty projektu wymagają aktywnego sprawdzania certyfikatów, możesz wyizolować ścieżkę wyszukiwania OpenSC. OpenSC odczytuje swoją konfigurację z lokalizacji określonej w zmiennej środowiskowej OPENSC_CONF. Kierując ją na pusty plik, zapobiegasz odczytywaniu przez moduł aktywnych profili kart inteligentnych.

W terminalu uruchom edytor, nadpisując zmienną konfiguracyjną:

OPENSC_CONF=/dev/null ./Engine/Binaries/Linux/UnrealEditor

Ponieważ /dev/null dostarcza pustą konfigurację, OpenSC inicjalizuje się w stanie uśpienia i nie rejestruje żadnych aktywnych slotów PKCS#11, co pozwala uniknąć kolizji przy dynamicznym linkowaniu.

Workaround 3: Wyłączenie widgetu CEF Web Browser za pomocą argumentów edytora

Jeśli nie potrzebujesz funkcji renderowania stron internetowych podczas sesji projektowych, możesz poinstruować Unreal Engine, aby całkowicie pominął inicjalizację CEF. Zapobiega to załadowaniu CEF oraz NSS do przestrzeni procesu, co oszczędza pamięć i pozwala uniknąć konfliktów bibliotek.

Aby uruchomić edytor z wyłączonym CEF, przekaż flagę -nocef:

./Engine/Binaries/Linux/UnrealEditor -nocef

Flaga ta wyłącza Welcome Screen, panele marketplace oraz elementy typu web-view. Reszta interfejsu edytora, zbudowana przy użyciu natywnego systemu renderowania Slate w silniku Unreal, będzie działać normalnie. Podczas debugowania niskopoziomowych problemów sieciowych lub crashów typu timeout na Linuxie, możesz również napotkać na UEFN Session Launch Timeout Nightmares, które wynikają z konfiguracji sterowników sieciowych.


Poradnik kodowania: Automatyzacja poprawki za pomocą skryptu wrapper (Wrapper Script)

Aby upewnić się, że Twój zespół deweloperski nie musi ręcznie konfigurować zmiennych środowiskowych przed uruchomieniem edytora, możesz stworzyć niestandardowy skrypt startowy. Ten skrypt powłoki (shell script) automatyzuje konfigurację środowiska i oczyszcza przestrzenie nazw bibliotek przed uruchomieniem procesów silnika.

Utwórz plik o nazwie LaunchEditor.sh w folderze swojego projektu lub w katalogu głównym Unreal Engine:

#!/usr/bin/env bash
# LaunchEditor.sh - Clean launcher wrapper for Unreal Engine 5.8 on Linux
# Sanitizes the environment to prevent CEF/NSS PKCS#11 symbol crashes.

set -euo pipefail

# 1. Define the Unreal Engine Installation Path
# Modify this path to match your environment.
UNREAL_ROOT_DIR="/opt/unreal-engine-5.8"
EDITOR_EXECUTABLE="${UNREAL_ROOT_DIR}/Engine/Binaries/Linux/UnrealEditor"

# Validate that the editor executable exists
if [[ ! -f "$EDITOR_EXECUTABLE" ]]; then
    echo "Error: UnrealEditor executable not found at: $EDITOR_EXECUTABLE" >&2
    echo "Please edit LaunchEditor.sh and correct the UNREAL_ROOT_DIR path." >&2
    exit 1
fi

# 2. Expose the environment variables to bypass PKCS#11 dynamic module loads
export NSS_DISABLE_PKCS11=1
export OPENSC_CONF="/dev/null"

# 3. Create a clean, isolated NSS database directory
# This prevents NSS from scanning the user's personal ~/.pki/nssdb certificates.
ISOLATED_NSS_DIR="/tmp/ue-nss-sandbox-${USER}"
if [[ ! -d "$ISOLATED_NSS_DIR" ]]; then
    mkdir -p "$ISOLATED_NSS_DIR"
    # Initialize an empty NSS database structure in the temporary directory
    certutil -N -d "sql:${ISOLATED_NSS_DIR}" --empty-password 2>/dev/null || true
fi
export NSS_DB_DIR="sql:${ISOLATED_NSS_DIR}"

# 4. Strip incompatible system library overrides
# Ensure LD_PRELOAD does not inject incompatible system allocator wrappers.
unset LD_PRELOAD

echo "System environment sanitized successfully."
echo "NSS_DISABLE_PKCS11 set to: $NSS_DISABLE_PKCS11"
echo "NSS_DB_DIR set to: $NSS_DB_DIR"
echo "Launching Unreal Editor..."

# 5. Hand over control to the editor process with original arguments
exec "$EDITOR_EXECUTABLE" "$@"

Upewnij się, że skrypt posiada uprawnienia do wykonywania:

chmod +x LaunchEditor.sh

Możesz teraz używać tego skryptu jako zamiennika polecenia w swoich desktop launchers lub konfiguracjach IDE:

./LaunchEditor.sh /home/user/projects/MyGame/MyGame.uproject

Programowa implementacja poprawki w C++

Jeśli chcesz zapobiec temu crashowi bez polegania na zewnętrznych wrapper scripts, możesz wstrzyknąć te zmienne środowiskowe programowo w punkcie wejścia modułu gry lub edytora. Zmienne te muszą zostać ustawione przed załadowaniem przez silnik bibliotek dynamicznych CEF.

Dodaj poniższy kod do implementacji StartupModule w swoim niestandardowym module edytora/gry:

#include "CoreMinimal.h"
#include "Modules/ModuleInterface.h"
#include "Modules/ModuleManager.h"
#include "HAL/PlatformMisc.h"

class FMyGameEditorModule : public IModuleInterface
{
public:
    virtual void StartupModule() override
    {
#if PLATFORM_LINUX
        UE_LOG(LogTemp, Warning, TEXT("Configuring Linux environment overrides."));

        // Disable PKCS#11 module scanning in NSS
        FString NssEnvVal = FPlatformMisc::GetEnvironmentVariable(TEXT("NSS_DISABLE_PKCS11"));
        if (NssEnvVal.IsEmpty())
        {
            FPlatformMisc::SetEnvironmentVar(TEXT("NSS_DISABLE_PKCS11"), TEXT("1"));
            UE_LOG(LogTemp, Log, TEXT("Set environment variable NSS_DISABLE_PKCS11=1"));
        }

        // Set OpenSC configuration path to /dev/null to prevent loading system card modules
        FString OpenSCEnvVal = FPlatformMisc::GetEnvironmentVariable(TEXT("OPENSC_CONF"));
        if (OpenSCEnvVal.IsEmpty())
        {
            FPlatformMisc::SetEnvironmentVar(TEXT("OPENSC_CONF"), TEXT("/dev/null"));
            UE_LOG(LogTemp, Log, TEXT("Set environment variable OPENSC_CONF=/dev/null"));
        }
#endif
    }

    virtual void ShutdownModule() override
    {
    }
};

IMPLEMENT_MODULE(FMyGameEditorModule, MyGameEditor)

Umieszczając tę logikę wewnątrz funkcji StartupModule głównego modułu edytora, gwarantujesz, że zmienne te zostaną wyeksponowane w przestrzeni procesu zanim CEF załaduje zależne biblioteki bezpieczeństwa sieciowego.


Alternatywa architektoniczna: Rozdzielenie autoryzacji webowej po stronie klienta (Decoupling Client-Side Web Authentication)

Nietrwałość (Fragility) widoków webowych po stronie klienta

Osadzenie pełnoprawnego silnika przeglądarki internetowej wewnątrz klienta gry tworzy ogromny narzut utrzymaniowy (maintenance burden). Silniki gier są projektowane do zarządzania niskoopóźnieniowymi rendering loops, asset managementem i obliczeniami fizycznymi. Nie są one przeznaczone do pełnienia roli bezpiecznych środowisk operacyjnych dla aplikacji webowych.

Kiedy osadzasz CEF, dziedziczysz cały obszar podatności bezpieczeństwa (security surface area) oraz zależności biblioteczne Chromium. Na Linuxie naraża to Twoją aplikację kliencką na różnice platformowe. Aktualizacja konfiguracji czytnika kart inteligentnych gracza, zmiana sposobu strukturyzacji mutexów w bibliotekach systemowych lub inna wersja OpenSSL w systemie mogą uniemożliwić uruchomienie gry.

Dlaczego autoryzacja bezgłowowa (Headless Authentication) jest bezpieczniejsza

Zamiast dostarczać ciężkie, niestabilne środowisko uruchomieniowe przeglądarki (browser runtime) w pliku binarnym gry w celu obsługi autoryzacji, powinieneś oddzielić interfejs użytkownika od podstawowej logiki uwierzytelniania. Przejście z osadzonej przeglądarki na model headless authentication lub korzystanie z domyślnej przeglądarki systemowej do przekierowań OAuth pozwala zachować czysty i odseparowany (decoupled) plik binarny gry.

Ręczna budowa bezpiecznej, niestandardowej infrastruktury uwierzytelniania to wielotygodniowy projekt inżynieryjny. Musisz skonfigurować serwery OAuth 2.0, opracować schematy baz danych do przechowywania tokenów, obsłużyć procedury token refresh oraz wdrożyć skalowalne serwery weryfikacyjne.

Dzięki horizOn cała ta infrastruktura jest zarządzana za Ciebie. Możesz uwierzytelniać graczy, synchronizować stany zapisu backend i obsługiwać weryfikację sesji za pomocą lekkich wywołań API, bez ładowania web rendering frameworks takich jak CEF. Przenosząc te usługi do horizOn, eliminujesz konflikty bibliotek po stronie klienta, optymalizujesz czas uruchamiania i dbasz o to, aby klient gry działał stabilnie na wszystkich dystrybucjach Linuxa.


Dobre praktyki przy dewelopmencie i debugowaniu gier na Linuxie

Aby zapobiec konfliktom bibliotek i utrzymać sprawne działanie klienta gry na wielu różnych dystrybucjach systemu Linux, wdrożyj następujące zasady:

  1. Unikaj zanieczyszczania globalnej przestrzeni symboli procesu (Global Process Symbol Pollution): Podczas kompilowania niestandardowych wtyczek C++ lub bibliotek statycznych dla swojej gry, ogranicz widoczność symboli. Użyj flag kompilatora takich jak -fvisibility=hidden, aby upewnić się, że wewnętrzne symbole dynamiczne nie kolidują z bibliotekami systemu operacyjnego podczas uruchomienia (runtime).

  2. Oddziel widoki klienta od logiki backend (Decouple Client Views from Backend Logic): Zminimalizuj użycie osadzonych silników przeglądarek. Projektuj interfejs użytkownika z użyciem natywnych widgetów i przenoś skomplikowane zadania zarządzania kontem do lekkich interfejsów API lub zewnętrznych przeglądarek systemowych.

  3. Weryfikuj spakowane zależności (Validate Packaged Dependencies): Przed wydaniem buildu gry na Linuxa, przeanalizuj jej zależności dynamiczne. Uruchom ldd na docelowych plikach binarnych i upewnij się, że ścieżki wyszukiwania traktują priorytetowo dołączone biblioteki dynamiczne, a nie biblioteki systemu operacyjnego (hosta).

  4. Izoluj przechowywanie bazy danych NSS (Isolate NSS Database Storage): Przy uruchamianiu modułów inicjalizujących bezpieczne gniazda (secure sockets) lub certyfikaty na systemie Linux, przekieruj ich zapytania do bazy danych do czystego, wyizolowanego katalogu tymczasowego za pomocą NSS_DB_DIR, aby uniknąć odczytywania uszkodzonych lub niekompatybilnych konfiguracji lokalnego systemu operacyjnego.

  5. Wykorzystuj Headless APIs dla Live Operations: Wybieraj platformy backend, które stawiają na lekkie integracje typu API-first zamiast ciężkich klienckich SDKs. Gwarantuje to kompatybilność na wielu platformach, w tym na desktopowym Linuxie oraz konsoli Steam Deck.

Chcesz zabezpieczyć autoryzację multiplayer bez problemów ze stabilnością po stronie klienta? Wypróbuj horizOn za darmo lub zapoznaj się z naszymi poradnikami integracji.


Źródło: Unreal Engine 5.8 Linux Crash Report (CEF/NSS PKCS#11 Segfault)