Obsługa kompresji ASTC (Adaptable Scalable Texture Compression) to kolejna funkcja, którą opracowałem dla Castle Game Engine podczas pracy nad moją grą mobilną.
Dlaczego kompresja tekstur jest tak ważna (szczególnie) dla gier mobilnych?
Powolne CPU/GPU
CPU/GPU w urządzeniach mobilnych są znacznie wolniejsze niż przeciętne CPU/GPU w komputerach stacjonarnych. Dlatego kiedy używasz zwykłych plików PNG, muszą one zostać przetworzone (zdekompresowane), zanim będą mogły być użyte. Zabija to wydajność i ma istotny wpływ na czas działania urządzenia na baterii. W przeciwieństwie do tekstur skompresowanych specjalnie dla GPU.
Brak oddzielnej pamięci dla GPU
W większości urządzeń GPU używa po prostu pamięci RAM urządzenia, dodatkowo tej pamięci nie jest za dużo i nie jest za szybka. Plik PNG na dysku może wydawać się mały, ale zajmuje dużo więcej pamięci GPU (pamięci RAM dla urządzeń mobilnych) niż specjalnie skompresowana tekstura, która może być większa na dysku.
Np.: jeżeli mamy obraz PNG 512×512 RGBA (32-bitowy) o rozmiarze na dysku 11 045 bajtów to w pamięci będzie to 512 x 512 x 4 = 1 048 576 bajtów.
W przypadku skompresowania tego obrazu za pomocą ASTC 8×8 będzie to (512/8) x (512/8) x 16 = 65 536 bajtów (w pamięci i na dysku).
Jak widać pliki PNG są lepsze tylko pozornie. Oczywiście jakość może być niższa (kompresja jest stratna), ale wzrost wydajności jest ogromny i wart niewielkiej redukcji jakości.
Dlaczego ASTC?
Jest wiele formatów kompresji tekstur (obsługiwanych przez CGE):
- PVRTC – obsługiwane przez GPU PowerVR
- ATITC – obsługiwane przez Qualcomm (układy Adreno)
- S3TC – obsługiwane przez Nvidia (układy Tegra)
- ETC1 – powinien być obsługiwany przez wszystkie urządzenia, ale nie obsługuje kanału alfa
Czy musimy więc wygenerować i dodać tekstury dla wszystkich tych układów GPU? Dzięki ASTC, na szczęście nie!
Jeden by wszystkimi rządzić!
ASTC (Adaptable Scalable Texture Compression) zostało stworzone, aby pozbyć się tego bałaganu, zapewniając jeden elastyczny format. Wszystkie nowe procesory graficzne począwszy od drugiej generacji serii Mali-T600, Adreno 400, Apple A8 obsługują ASTC. Bardzo stare urządzenia nie są obsługiwane, ale myślę, że nie są one obecnie zbyt szeroko używane (szczególnie do grania w gry). Jeśli chcesz, zawsze możesz dodać inny format kompresji w celu ich obsługi.
Różne poziomy kompresji
Rozmiar bloku może wynosić od 4 (najlepsza jakość) do 12 (najmniejszy rozmiar). W zależności od przeznaczenia możesz wybrać inny poziom jakości.
Wszystkie rozmiary
Rozmiar tekstury nie musi być potęgą 2 więc nie ma problemu z nieregularnymi rozmiarami tekstur (jak np. w elementach GUI).
Jak użyć ASTC w Castle Game Engine?
Castle Game Engine pozwala łatwo generować skompresowane wersje tekstur, ale najpierw musisz skonfigurować swoje środowisko.
Konfiguracja narzędzi
Aby generować tekstury ASTC, potrzebujesz dwóch narzędzi w zmiennej środowiskowej PATH
:
-
astcenc
– narzędzie, które generuje tekstury, możesz je pobrać razem z Mali Texture Compression Tool, - PVRTexToolCLI z PowerVR Tools and SDK – dobrze wybrać instalator online i dostosować instalację (pełny instalator waży powyżej 2GB)
Na moim komputerze z systemem Windows ścieżki wyglądają następująco:
C:\Program Files\ARM\Mali Developer Tools\Mali Texture Compression Tool v4.3.0\bin\
i C:\Imagination\PowerVR_Graphics\PowerVR_Tools\PVRTexTool\CLI\Windows_x86_64
.
Na maszynie z systemem Linux, możesz zmodyfikować plik .profile
:
export PATH=$PATH:"/opt/Imagination/PowerVR_Graphics/PowerVR_Tools/PVRTexTool/CLI/Linux_x86_64/" export PATH=$PATH:"/home/user/bin/Mali_Texture_Compression_Tool_v4.3.0.b81c088_Linux_x64/bin/"
Oczywiście podane powyżej ścieżki to tylko przykłady, powinieneś użyć ścieżek, w których zainstalowałeś te narzędzia.
Konfiguracja CGE
Najpierw musisz przygotować plik material_properties.xml
, najprostszy będzie wyglądał tak:
<?xml version="1.0"?> <properties> <auto_generated_textures> <compress> <format name="ASTC_8x8_RGBA"/> </compress> <scale smallest="1" /> <include path="*" recursive="True" /> </auto_generated_textures> </properties>
Więcej informacji na temat tego pliku możesz znaleźć tutaj.
Następnie musisz poinformować CGE o wygenerowanych teksturach. Aby to zrobić, po prostu dodaj CastleMaterialProperties
do sekcji uses
i ustaw MaterialProperties.URL
:
MaterialProperties.URL := 'castle-data:/material_properties.xml';
Generowanie tekstur
Aby wygenerować tekstury, wywołaj narzędzie budowania castle-engine
z opcją auto-generate-textures
:
castle-engine auto-generate-textures
Po zmianie danych gry zawsze wywołuj generowanie tekstur castle-engine auto-generate-textures
. Dzięki temu zostaną przebudowane zmienione pliki.
Projekt można wyczyścić z automatycznie wygenerowanych plików za pomocą:
castle-engine auto-generate-clean
Uwaga! Jeżeli używasz wydania CGE sprzed 24.07.2019, musisz przebudować narzędzie castle-engine
Co dodać do systemu kontroli wersji?
Generowanie tekstur może zajmować trochę czasu, jeżeli chcesz tego uniknąć wygenerowane pliki możesz dodać do VSC. Ale w takim przypadku powinieneś dodać także plik castle_engine_auto_generated.xml
. Jeżeli nie chcesz dodawać wygenerowanych plików do VSC, nie dodawaj także pliku castle_engine_auto_generated.xml
.