Godot Engine 3.2 - Jakość przede wszystkim

Niecałe dwa dni temu odbyła się premiera nowej wersji Godota - lekkiego i otwartego silnika do tworzenia gier, działającego natywnie i bez konieczności instalacji na Linuxie, Windowsie i macOS.

Od czasu wydania wersji 3.1 projekt zyskał środki na zatrudnienie trzeciego dewelopera, otrzymał $50000 od Mozilli na implementację mechanizmów związanych z sieciową stroną silnika oraz w dalszym ciągu Microsoft na swój koszt zatrudnia dewelopera ulepszającego obsługę C# w Godocie.
Mimo, że wszyscy oczekujemy na wersję 4.0, której główną atrakcją ma być wsparcie dla Vulkan API oraz szereg niskopoziomowych optymalizacji zwłaszcza dla 3D, to premiera wersji 3.2 Godota, stanowi duży krok w jego rozwoju, mimo, że nie była planowana na tak duże wydanie, przy którym pracowało aż 450 osób, z czego około 300 pierwszy raz.

Zmiany

Pseudo efekt 3D w 2D

W związku z coraz częstszym wykorzystywaniem w grach 2D trójwymiarowych warstw, Godot doczekał się wsparcia dla pseudo 3D w całości działającego w przestrzeni 2D(w przeciwieństwie do gier tj. Hollow Knight czy Rayman Origins). Aby uzyskać taki efekt, należy użyć węzła CanvasLayer z włączoną opcją "Follow Viewport" oraz ustawioną właściwością "Scale".


Dokumentacja

Niegdyś niekompletna i przestarzała, dziś olbrzymia i obfitująca w różnorakie przykłady.
Od czasu wydania Godota 3.1, stopień opisu klas i metod wzrósł z poziomu 73% do ponad 90%. Ponad dwieście osób w ponad 7000 commitach pracowało nad tym by dokumentacja, oferowała zarówno podstawową jak i zaawansowaną wiedzę dla użytkowników.
Od teraz również jest możliwe pobranie dokumentacji w formie offline(kiedyś też była taka opcja, która niestety nie działała tak jak powinna) na stronie https://archive.hugo.pro/builds/godot/master/docs/godot-docs-html-nigh...

Dodanie WebRTC

Jednym z celów hojnej dotacji Mozilli, było zaimplementowanie w Godocie standardu WebRTC.
WebRTC jest technologią stworzoną przez Google, która ma zapewnić pewną i bezpieczną komunikację czasu rzeczywistego pomiędzy użytkownikami.
Opiera się ona na idei bezpośredniej komunikacji pomiędzy nimi bez potrzeby ciągłego korzystania z serwera(mimo to serwer jest używany na początku komunikacji).
Pomoże ona w tworzeniu gier w przeglądarce z minimalnym opóźnieniem(WebRTC korzysta z UDP) oraz pozwoli na bezpośrednie połączenie się dwóch graczy ze sobą, za pomocą specjalnego tunelu.
Część pracy została już wykonana podczas poprzedniego GSoC.

Wsparcie dla plików FBX

Jedną z bardziej pożądanych przez użytkowników funkcji, była możliwość importu modeli 3D zapisanych we własnościowych formatach takich jak FBX czy MMD Rozwiązaniem tych problemów okazało się włączenie do silnika biblioteki Assimp, która jest odpowiedzialna za ich import.
Do tej pory Godot wspierał standardy DAE(COLLADA), GLTF 2 oraz OBJ(WaveFront)

Obsługa atlasów

Obsługa atlasów będących zbiorami wielu obrazów w jednym pliku, powraca po krótkiej nieobecności w wersji 3.0 i 3.1. Ich użycie w wielu przypadkach skutkuje zwiększeniem wydajności, mniejszym użyciem pamięci VRAM i zmniejszonym czasem ładowania. Atlasy powinny być używane gdy w plikach z animacjami znajduje się dużo pustych przestrzeni lub podczas optymalizacji gry.

C# na Androidzie i w przeglądarce

Mimo zapewnień i ogromu pracy włożonego we wsparcie dla C# w Godocie, nie udało się zapewnić dla niego pełnej funkcjonalności we wcześniejszych wersjach silnika. 
Jednak tym razem dzięki kolejnym dotacjom Microsoftu, które to były przeznaczone na zatrudnienie dewelopera do rozwijania tego języka w Godocie, silnik będzie w tej wersji posiadał możliwość eksportu projektu na Androida oraz do przeglądarki. 
W przeglądarce wsparcie dla C# zostało przygotowane korzystając z WebAssembly, które jest rekomendowaną technologią przez konsorcjum WWW.

Blokada części funkcji w edytorze

Blokada pewnych elementów w edytorze zapewne przyda się wielu osobom, firmom oraz organizacjom, którym nie potrzebne są wszystkie elementy UI.
Można na tę chwilę zablokować:
- edytor 3D, edytor skryptów, sklep z zasobami
- panele importu, systemu plików czy sygnałów
- edytowanie węzłów i scen w Drzewie Scen(Scene Tree)
- wyświetlanie części typów węzłów np. AnimatedScene2D czy Area
- niektóre z typów zasobów jak GradientTexture
- wyświetlanie ustawień wybranych dla wybranych klas
Profile z wyłączonymi poszczególnymi elementami możemy modyfikować, eksportować i importować.

Nowy system wtyczek na Androida

Tworzenie i testowanie gier na Androidzie wymagało(i ciągle) wymaga jedynie pojedynczego kliknięcia, dzięki czemu możemy w czasie rzeczywistym sprawdzać parametry gry, reagować na błędy i inne sytuacje.
Dużym problemem dla niektórych użytkowników było dodawanie wtyczek dla Androida, które wymagało od użytkownika rekompilacji całego silnika.
Reduz, główny programista, przygotował do tego celu nowy system budowania szablonów eksportu, dzięki czemu wtyczki są dołączane do pliku apk w locie.
Dzięki zmianom, wtyczki mogą być instalowane w prosty sposób, tak jak na komputerach np. poprzez pobranie plików z Asset Library.

Profiler sieci

Kolejną z nowości sfinansowaną przez zewnętrzną firmę(tym razem przez IMVU) jest dodanie nowego profilera sieci.
Domyślnie znajduje się w zakładce Debugger i jest odpowiedzialny za zbieranie, analizowanie i wyświetlanie danych, które zostały przesłane za pomocą multiplayer API.
Zbiera w czasie rzeczywistym takie informacje jak aktualną ilość wysyłanych i pobieranych danych w ciągu sekundy, zlicza RPC, które może pomóc w znalezieniu węzłów korzystających nadmiernie z połączenia sieciowego.

Własne poprawki

Jako, że często korzystam z oprogramowania open source na co dzień, to postanowiłem wesprzeć społeczność poprawkami, które i mnie i innym się przydadzą, na tyle na ile moje umiejętności pozwalały
Oto niektóre z
Naprawa wycieków pamięci - np. #30155, #30576, #31768 - Godot używa mieszanki smart pointerów(własnej implementacji, nie z biblioteki) jak i zwykłych wskaźników, przez co czasami występują wycieki pamięci(rzadko, ale jednak). Do wyszukiwania wycieków korzystałem z systemu Ubuntu, gdyż posiada darmowe narzędzi niedostępnych na innych platformach) oraz najpierw z Valgrinda, który jednak gdy okazał się zbyt wolny, a potem przesiadłem się na Leak Sanitizer, który wymagał jedynie dodania dodatkowych argumentów do kompilacji `scons p=x11 -j6 use_lsan=yes` a działał kilkakrotnie szybciej.
Zapobieganie wyłączaniu się Godota - np. #32569, #29947, #32563 - Podczas wykonywania pewnych funkcji edytor albo program wyłączały się niespodziewanie, dlatego stworzyłem projekt The worst godot test project w którym to testuję z grubsza każdą możliwą funkcję z różnymi parametrami. Póki co do tej poru pomógł mi on znaleźć ponad 100 błędów w Godocie.
Przycisk do usuwania wszystkich niedostępnych projektów - #25713 - Podczas gdy zmienimy lokalizację projektu, menedżer projektów ciągle przechowuje informację o jego lokalizacji. Ten PR wprowadza przycisk, który to umożliwia za pomocą pojedynczego kliknięcia usunąć wszystkie nieprawidłowe projekty.
Dodanie opisu dla niektórych błędów - #32051 - w tym PR część błędów w stylu `core/node_path.cpp:215 - Condition ' !data ' is true. returned: StringName()` zostało zamienionych na `You can't use Node Path without data`
Zapobieganie przepełnieniu zmiennych - #31513 - Niebezpiecznie jest pozwalać na to, by wartość przypisana do zmiennej została ucięta z powodu jej zbyt małej pojemności. Taka zmienna może posiadać wtedy wartość, która nie będzie zgodna z naszymi oczekiwaniami. Ten patch wyświetla błąd, gdy ze zmiennej string chcemy stworzyć liczbę całkowitą nie mieszczącą się w swoim zakresie.
Usuwanie niepotrzebnego kodu - #30126, #30576, #30716 - W tych PR użyłem kilku statycznych analizatorów, które to pomogły usunąć zduplikowany kod, oczyścić jego strukturę i oczywiście naprawić błędy, które zwykłe osoby łatwo mogły przeoczyć. Dla Godota bardzo dobre okazały się darmowe narzędzia do sprawdzania kodu C++ - CppCheck, PVS Studio(darmowa licencja tygodniowa), Coverity Scan(Online), LGTM(również online) oraz Clang Static Analyzer(jako wtyczka do QTCreator).

Jak widać moje umiejętności w posługiwaniu się C++ nie są zbyt duże(większość moich PR ma zaledwie kilka linijek), w związku z czym w razie znalezienia jakiegoś prostego błędu w silniku, polecam sprawdzić swoje własne umiejętności programistyczne podczas próby jego naprawy, gdyż nie wymagają one jakiś gigantycznych umiejętności.

Inne

Convex Decomposition - https://godotengine.org/article/godot-3-2-adds-support-convex-decompos...
Generacja dźwięków i analiza ich spektrum - https://godotengine.org/article/godot-32-will-get-new-audio-features
Poprawki do wizualnego edytora shaderów - https://godotengine.org/article/major-update-for-visual-shader-in-godo...
Ulepszenie ARVR - https://godotengine.org/article/godot-3-2-arvr-update
Wbudowany mini serwer WWW i SSL dla Sockets - https://godotengine.org/article/websocket-ssl-testing-html5-export

To tylko część z nowości, obszerny opis zmian można znaleźć tutaj

Google Summer of Code

Korzystając z Google Summer of Code, twórcy Godota, skorzystali z pomocy ośmiu studentów, którzy za swoją pracę otrzymają wynagrodzenie w ramach tego programu. 
Z tego co widzę, część z nich została włączona w wydanie 3.2 a część zostanie dodana w następnej wersji Godota.

Integracja systemu kontroli wersji(VCS) - Twarit Waikar

Jedną z bardziej przydatnych opcji, która została zaimplementowana w Godocie 3.2 jest obsługa systemów kontroli wersji.
Na tę chwilę Twarit zaimplementował jedynie niepełną obsługę GIT, w której można przeglądać zmiany i je commitować ale jeszcze nie pushować. 
Dostępna jest w osobnej zakładce menu znajdującym się na górze ekranu. 
Umożliwia, tak jak większość programów do obsługi systemu kontroli wersji GIT, wyświetlanie listy zmienionych, utworzonych i usuniętych plików wraz z ich zawartością.
Wtyczkę można pobrać ze strony - https://github.com/godotengine/godot-git-plugin/releases

Serwer języka GDScript - Ankit Priyarup

Dotychczas jedyną sensowną opcją na pisanie skryptów w języku GDScript pozostawało pisanie ich we wbudowanym edytorze skryptów. 
Dzięki pracy Ankit, zewnętrzne programy(tj. Sublime, VSCodium czy VSCode) posiadające dużo większe predyspozycje do tworzenia i modyfikowania kodu niż wbudowany edytor tekstu, doczekały się możliwości podpowiadania nazw zmiennych, funkcji i ich parametrów. 
Aby korzystać z funkcji auto uzupełniania, konieczne jest jedynie zainstalowanie wtyczki w danym programie(na chwilę obecną znalazłem jedynie wtyczkę do VScodium, VSCode - https://github.com/godotengine/godot-vscode-plugin/releases).

Statyczny analizator dla GDScript - Suhas Prasanna

Zaimplementowany w Godocie system ostrzeżeń, do tej pory działał póki co jedynie w obrębie jednego pliku.
Aby zredukować liczbę możliwych błędów, Suhas stworzył statyczny analizator, który może działać pomiędzy wieloma skryptami.
Na tę chwilę potrafi wykrywać sytuacje, w których za pomocą get_node() użytkownik będzie chciał pobrać nieistniejący węzeł, znaleźć przypisanie do węzła skryptu dziedziczącego po błędnym typie czy wykryć w sygnałach użycie argumentów o niewłaściwej kolejności.
Jego obsługa jeszcze nie została włączona do wersji 3.2 oraz interfejs nie został jeszcze ukończony, lecz możliwe, że statyczny analizator będzie obecny w kolejnych wydaniach poprawkowych(np. 3.2.3).

Inne

Przepisanie mappera świateł - Joan Fons Sanchez
Interaktywna Muzyka - Daniel Matarov
Implementacja Motion Matching - Aditya Abhiram
Asynchroniczny buforowany dostęp do plików - Raghav Shankar
Poprawki dla graficznego edytora skryptów - Swarnim Arun

Przyszłość

Mimo, że to wydanie obfitowało w szereg zmian i nowości(czego sami twórcy nie zaplanowali), to w kolejnych miesiącach i wydaniach Godot wzbogaci się w szereg przydatnych funkcji i nowości:
- Wsparcie dla Vulkan API(4.0)
- GDScript kompilowany do C++(? 4.1+)
- Natywne wsparcie dla Waylanda na Linuxie(?)
- Eksport sceny z Godota do pliku GLTF 2.0(4.0)
- Dodanie ARCore(4.0)
- Dynamiczna i nieskończona siatka 3D(4.0)
- Automatyczne poprawianie wyglądu kodu(4.1) 

Oczywiście silnik można pobrać za darmo bez konieczności instalacji ze strony - https://godotengine.org/download/