Defold obsługuje automatyczne przetwarzanie tekstur i kompresję danych obrazów (w Atlasie, Źródłach Kafelków (Tile sources), Mapach Kostkowych (Cubemaps) i samodzielnych teksturach używanych do modeli, GUI itp).
Istnieją dwa rodzaje kompresji: programowa i sprzętowa kompresja tekstur.
Programowa kompresja tekstur (software texture compression) (takie jak PNG i JPEG) zmniejsza rozmiar pamięci zasobów obrazu. Powoduje to zmniejszenie ostatecznego rozmiaru paczki z grą. Jednak pliki obrazów muszą być rozpakowane podczas wczytywania do pamięci, więc nawet jeśli obraz jest mały na dysku, może zajmować dużo miejsca w pamięci.
Sprzętowa kompresja tekstur (hardware texture compression) również zmniejsza rozmiar pamięci zasobów obrazu. Jednak w przeciwieństwie do kompresji programowej, zmniejsza rozmiar tekstur w pamięci. Dzieje się tak, ponieważ sprzęt graficzny może bezpośrednio zarządzać teksturami skompresowanymi, bez konieczności ich wcześniejszego dekompresowania.
Przetwarzanie tekstur jest konfigurowane za pomocą konkretnego profilu tekstury (ang. texture profile). W tym pliku tworzysz profile, które wyrażają, jakie skompresowane formaty i jakiego typu powinny być używane przy tworzeniu paczki z grą dla określonej platformy. Profile są przypisane do odpowiadających im wzorców plików - paths patterns, co pozwala na dokładną kontrolę nad tym, które pliki w twoim projekcie powinny być kompresowane i w jaki sposób dokładnie.
Ponieważ każda dostępna sprzętowa kompresja tekstur jest stratna, otrzymasz tzw. artefakty w danych tekstury. Te artefakty są silnie zależne od tego, jak wygląda twój materiał źródłowy i jakie metody kompresji są używane. Powinieneś przetestować swój materiał źródłowy i eksperymentować, aby uzyskać najlepsze wyniki. Wujek Google może być twoim przyjacielem w tej kwestii.
Możesz wybrać, jakie kompresje obrazów oprogramowania są stosowane na ostatecznych danych tekstury (skompresowane lub nieskompresowane) w archiwum paczki (bundle archives). Defold obsługuje kompresję tekstury Basis Universal, która kompresuje obraz w pośredni format. Ten format jest przekształcany w czasie rzeczywistym na format sprzętu odpowiedni dla GPU bieżącego urządzenia. Format Basis Universal jest formatem wysokiej jakości, ale stratnym. Wszystkie obrazy są również kompresowane za pomocą LZ4, aby jeszcze bardziej zmniejszyć rozmiar pliku, gdy są przechowywane w archiwum gry.
Kompresja jest operacją czasochłonną i wymagającą sporych zasobów, która może spowodować bardzo długie czasy kompilacji, w zależności od liczby obrazów do skompresowania oraz wybranych formatów tekstury i rodzaju wybranej programowej kompresji tekstur.
Każdy projekt zawiera określony plik .texture_profiles, który zawiera konfigurację używaną podczas kompresji tekstur. Domyślnie ten plik to builtins/graphics/default.texture_profiles i zawiera konfigurację dopasowującą każdy zasób tekstury do profilu przy użyciu RGBA bez sprzętowej kompresji tekstur i z domyślną kompresją plików ZLib.
Aby dodać kompresję tekstur:
W preferencjach Edytora można włączyć i wyłączyć korzystanie z profili tekstur. Wybierz File ▸ Preferences.... Karta General zawiera opcję Enable texture profiles (Włącz profile tekstur).
Sekcja Path Settings (Ustawienia ścieżki) w pliku profilów tekstur zawiera listę wzorców ścieżek i informacje, który profil ma być używany przy przetwarzaniu zasobów odpowiadających danej ścieżce. Ścieżki wyrażone są jako wzorce “Ant Glob” (zobacz tutaj w celu uzyskania szczegółów). Wzorce można wyrazić przy użyciu następujących symboli wieloznacznych (wildcards):
*
sprite*.png
pasuje do plików sprite.png
, sprite1.png
i sprite_with_a_long_name.png
.?
sprite?.png
pasuje do plików sprite1.png
, spriteA.png
, ale nie pasuje do sprite.png
ani sprite_with_a_long_name.png
.**
/gui/**
pasuje do wszystkich plików w katalogu /gui
i wszystkich jego podkatalogach.Ten przykład zawiera dwa wzorce ścieżek i odpowiadające im profile.
/gui/**/*.atlas
/**/*.atlas
Należy zauważyć, że bardziej ogólna ścieżka jest podawana na końcu. Kryterium działania jest określone jako od góry do dołu. Pierwsze wystąpienie, które pasuje do ścieżki zasobu, zostanie użyte. Dopasowanie ścieżki niżej na liście nigdy nie zastępuje pierwszego trafienia. Gdyby ścieżki były podane w odwrotnej kolejności, każda mapa kostek zostałaby przetworzona profilem “atlas”, nawet te w katalogu /gui.
Zasoby tekstur, które nie pasują do żadnej ścieżki w pliku profili, zostaną skompilowane i przeskalowane do najbliżej potęgi liczby 2, ale poza tym pozostaną nietknięte.
Sekcja profiles (profile) w pliku profili tekstur zawiera listę nazwanych profili. Każdy profil zawiera jedną lub więcej platform (platforms), a każdą platformę opisuje lista właściwości.
OS_ID_GENERIC
pasuje do wszystkich platform, w tym do wersji dev-app na urządzeniu, OS_ID_WINDOWS
pasuje do wersji docelowych systemów Windows, OS_ID_IOS
pasuje do wersji na urządzenia iOS itp. Należy zauważyć, że jeśli określono OS_ID_GENERIC
, zostanie on uwzględniony we wszystkich platformach.Jeśli dwa ustawienia ścieżki pasują do tego samego pliku i ścieżka używa różnych profili z różnymi platformami, zostaną użyte oba profile i zostaną wygenerowane dwie tekstury.
Do każdego profilu dodawane są następujące formaty (Formats):
Poziom | Informacja |
---|---|
FAST |
Najszybsza kompresja. Niska jakość grafiki |
NORMAL |
Domyślna kompresja. Najlepsza jakość grafiki |
HIGH |
Najwolniejsza kompresja. Mniejszy rozmiar pliku |
BEST |
Wolna kompresja. Najmniejszy rozmiar pliku |
Od wersji 1.2.185 nazwy te zostały zmienione - zredefiniowane, aby uniknąć niejednoznaczności.
COMPRESSION_TYPE_DEFAULT
albo COMPRESSION_TYPE_BASIS_UASTC
. Zobacz Typy Kompresji tutaj.Tekstury sprzętowe mogą być przetwarzane na dane nieskompresowane lub skompresowane stratnie o różnej liczbie kanałów i głębi bitowej. Kompresja sprzętowa oznacza, że ostateczny obraz będzie miał stały rozmiar, niezależnie od zawartości obrazu. Oznacza to, że utrata jakości podczas kompresji zależy od zawartości oryginalnej tekstury.
Ponieważ transkodowanie kompresji Basis Universal zależy od możliwości karty graficznej (GPU) urządzenia, zalecane formaty do użycia z kompresją Basis Universal to ogólne formaty, takie jak:
TEXTURE_FORMAT_RGB
, TEXTURE_FORMAT_RGBA
, TEXTURE_FORMAT_RGB_16BPP
, TEXTURE_FORMAT_RGBA_16BPP
, TEXTURE_FORMAT_LUMINANCE
i TEXTURE_FORMAT_LUMINANCE_ALPHA
.
Transkoder Basis Universal obsługuje wiele formatów wyjściowych, takich jak: ASTC4x4
, BCx
, ETC2
, ETC1
i PVRTC1
.
Obecnie obsługiwane są następujące formaty kompresji stratnej:
Format | Kompresja | Szczegóły |
---|---|---|
TEXTURE_FORMAT_RGB |
brak | Kolor 3-kanałowy. Alfa jest usuwana. |
TEXTURE_FORMAT_RGBA |
brak | Kolor 3-kanałowy i pełna alfa. |
TEXTURE_FORMAT_RGB_16BPP |
brak | Kolor 3-kanałowy. 5+6+5 bitów. |
TEXTURE_FORMAT_RGBA_16BPP |
brak | Kolor 3-kanałowy i pełna alfa. 4+4+4+4 bity. |
TEXTURE_FORMAT_LUMINANCE |
brak | Skala szarości 1-kanałowa, brak alfy. Kanały RGB pomnożone przez siebie. Alfa jest usuwana. |
TEXTURE_FORMAT_LUMINANCE_ALPHA |
brak | Skala szarości 1-kanałowa i pełna alfa. Kanały RGB pomnożone przez siebie. |
Obsługiwane są następujące typy programowych kompresji obrazów. Dane są rozpakowywane, gdy plik tekstury jest ładowany do pamięci.
Obecnie analizujemy, jak ponownie wprowadzić obsługę sprzętowa formatów, a także dodatkową obsługę kompresji WEBP. Nasze obecne długotrwałe zadanie polegające na wprowadzeniu wtyczek do przetwarzania treści ma na celu rozwiązanie tego problemu.
Typ | Formaty | Szczegóły |
---|---|---|
COMPRESSION_TYPE_DEFAULT |
Wszystkie formaty | Ogólna kompresja danych bez utraty. Domyślna. |
COMPRESSION_TYPE_BASIS_UASTC |
Wszystkie formaty RGB/RGBA | Wysoka jakość kompresji Basis Universal, utrata jakości. Niższy poziom jakości prowadzi do mniejszego rozmiaru. |
Aby lepiej zrozumieć wyniki, oto przykład. Należy pamiętać, że jakość obrazu, czas kompresji i rozmiar kompresji zawsze zależą od obrazu wejściowego i mogą się różnić.
Obraz oryginalny (1024x512):
Poziom | Czas kompresji | Czasy relatywny |
---|---|---|
FAST |
0m0.143s | 0.5x |
NORMAL |
0m0.294s | 1.0x |
HIGH |
0m1.764s | 6.0x |
BEST |
0m1.109s | 3.8x |
Porównanie wykonuje się za pomocą narzędzia basisu
(pomiar PSNR)
100 dB oznacza brak utraty sygnału (jest to to samo co oryginalny obraz)
Poziom | Sygnał |
---|---|
FAST |
Max: 34 Mean: 0.470 RMS: 1.088 PSNR: 47.399 dB |
NORMAL |
Max: 35 Mean: 0.439 RMS: 1.061 PSNR: 47.620 dB |
HIGH |
Max: 37 Mean: 0.898 RMS: 1.606 PSNR: 44.018 dB |
BEST |
Max: 51 Mean: 1.298 RMS: 2.478 PSNR: 40.249 dB |
Oryginalny rozmiar pliku wynosi 1572882 bajtów.
Poziom | Rozmiar pliku | Procent |
---|---|---|
FAST |
357225 | 22.71 % |
NORMAL |
365548 | 23.24 % |
HIGH |
277186 | 17.62 % |
BEST |
254380 | 16.17 % |
Oto wynikowe obrazy (pobrane z kodowania ASTC przy użyciu narzędzia basisu
)
FAST
NORMAL
HIGH
BEST
Did you spot an error or do you have a suggestion? Please let us know on GitHub!
GITHUB