Po roku prac nad projektem przedstawiono pierwszą wersję nowego otwartego silnika gier Ambient. Silnik ten oferuje runtime do tworzenia gier wieloosobowych oraz aplikacji 3D, które są kompilowane do postaci WebAssembly i wykorzystują API WebGPU do renderowania. Kod został napisany w języku Rust i jest wydawany na licencji MIT.
Kluczowym zadaniem przy opracowywaniu Ambient jest dostarczenie narzędzi, które upraszczają tworzenie gier wieloosobowych, czyniąc je równie prostymi jak projekty jednego gracza. Silnik początkowo koncentruje się na stworzeniu uniwersalnego runtime, który wspiera rozwój gier i aplikacji w dowolnym języku programowania, pod warunkiem, że mogą one być kompilowane do pośredniego kodu WebAssembly. Niemniej jednak, w pierwszej wersji wprowadzono jedynie wsparcie dla programowania w języku Rust.
Kluczowe cechy nowego silnika:
- Przejrzyste wsparcie dla interakcji sieciowych. Silnik łączy funkcje klienta i serwera, dostarczając wszystkie potrzebne komponenty do stworzenia logiki klienta i serwera, a także automatycznie synchronizuje stan serwera na klientach. Po stronie klienta i serwera stosowana jest wspólna model danych, co ułatwia przenoszenie kodu między backendem a frontendem.
- Uruchomienie każdego modułu w swoim izolowanym środowisku, co pozwala ograniczyć wpływ kodu, który nie jest godny zaufania. Awaryjne zakończenie modułu nie prowadzi do awaryjnego zakończenia całej aplikacji.
- Architektura ukierunkowana na przetwarzanie danych (Data-oriented). Zapewnienie modelu danych opartego na systemie komponentów, którymi może manipulować każdy moduł WASM. Wykorzystanie wzorca projektowego ECS (Entity Component System). Przechowywanie danych wszystkich komponentów w scentralizowanej bazie danych na serwerze, stan której jest automatycznie replikowany do klienta, który z kolei może rozszerzać dane, biorąc pod uwagę lokalny stan.
- Możliwość tworzenia modułów Ambient w dowolnych językach programowania, które mogą być kompilowane do WebAssembly (aktualnie wspierany jest tylko Rust).
- Generowanie uniwersalnych plików wykonywalnych, które mogą być uruchamiane w systemach Windows, macOS i Linux, oraz działać zarówno jako klient, jak i serwer.
- Możliwość definiowania własnych komponentów i "konceptów" (kolekcji komponentów). W projektach, które wykorzystują te same komponenty i koncepty, zapewniana jest przenośność i wspólne użytkowanie danych, nawet jeśli te dane nie są specjalnie przystosowane do używania w konkretnych projektach.
- Wsparcie dla kompilacji zasobów w różnych formatach, w tym .glb i .fbx. Możliwość strumieniowego ładowania zasobów z sieci — klient może otrzymać wszystkie niezbędne zasoby przy połączeniu z serwerem (można rozpocząć grę, nie czekając na załadowanie wszystkich zasobów). Obsługiwane są formaty modeli FBX i glTF oraz różne formaty dźwięku i obrazów.
- Zaawansowany system renderowania, korzystający z GPU dla przyspieszenia wyjścia, obsługujący wykonywanie przycięcia w oparciu o widoczność oraz zmianę poziomów szczegółowości po stronie GPU. Użycie domyślnie fizycznie poprawnego renderowania (PBR), wsparcie dla animacji oraz kaskadowych cieni.
- Wsparcie dla symulacji procesów fizycznych na bazie silnika PhysX.
- System budowy interfejsów użytkownika podobny do React.
- Ujednolicona system wejścia, niezależna od aktualnej platformy.
- System dźwięku przestrzennego z podłączanymi filtrami.
Rozwój wciąż znajduje się w fazie alfa. Z jeszcze niezaimplementowanych funkcji można wyróżnić możliwość uruchamiania w Web, interfejs API dla klientów, API do zarządzania wielowątkowością, biblioteka do tworzenia interfejsu użytkownika, API do używania własnych shaderów, wsparcie dla dźwięku, ładowanie i zapisywanie komponentów ECS (System Komponentów Podmiotów), ponowne ładowanie zasobów w locie, automatyczne skalowanie. serwerów, edytor do wspólnego tworzenia map gier i scenariuszy gier.

Źródło: opennet.ru
