Używam .png
s dla moich tekstur i używam wirtualnego systemu plików w .zip
pliku dla mojego projektu gry. Oznacza to, że moje tekstury są dwukrotnie kompresowane i dekompresowane. Jakie są rozwiązania tego problemu podwójnej kompresji? Jednym z rozwiązań, o których słyszałem, jest użycie .tga
s do tekstur, ale wydaje się, że wieki temu, odkąd to słyszałem. Innym rozwiązaniem jest wdrożenie dekompresji na, GPU
a ponieważ jest to szybkie, zapomnij o kosztach ogólnych.
textures
assets
compression
użytkownik1095108
źródło
źródło
Odpowiedzi:
Format zip obsługuje kilka różnych algorytmów kompresji. Możesz użyć innego algorytmu dla każdego pliku w archiwum. Jeśli chcesz przechowywać skompresowane pliki, które nie korzystają z dodatkowej kompresji (np. PNG) w archiwum zip, możesz zakodować te pliki za pomocą algorytmu „zapisanego”, który w ogóle się nie kompresuje. Okno dialogowe „Dodaj do archiwum” 7-zip pozwala wybrać to w „Siła kompresji”.
Ale gdy w archiwach masz nie tylko obrazy, ale także inne, bardziej kompresowalne zasoby, wybranie algorytmu dla każdego pliku może być dość nużące. W takim przypadku możesz raczej wybrać nieskompresowany format obrazu w archiwum kompresującym.
Format TGA zna wiele różnych trybów, z których niektóre są skompresowane, a niektóre nie. Jeśli nie chcesz używać kompresji, upewnij się, że wybrałeś właściwą w opcjach eksportu edytora graficznego, którego używasz. Innym nieskompresowanym formatem obrazu jest BMP (Windows Bitmap).
Oto test, który zrobiłem. Wielokrotnie dodawałem ten sam obraz (zasób z mojego obecnego projektu) w różnych formatach do archiwum zip, niektóre z algorytmem „deflate” na normalnej sile, a drugie z „store”. Przepraszamy za niemiecki GUI. Druga kolumna ma nieskompresowany rozmiar, trzecia kolumna jest algorytmem kompresji, a czwarta kolumna ma rozmiar skompresowany.
Jak widać, kodowanie deflate PNG pozwoliło zaoszczędzić zaledwie 0,3%, podczas gdy BMP kodowany deflate jest redukowany do jednej dziesiątej oryginalnego pliku, który jest nawet mniejszy niż wersja PNG. To mnie zaskoczyło. Spodziewałbym się, że PNG będzie mniejszy, ponieważ metoda kompresji PNG powinna być zoptymalizowana dla danych obrazu, podczas gdy ZIP nie jest. Prawdopodobnym wyjaśnieniem jest to, że mój edytor obrazów (GIMP) dodał całkiem sporo meta-informacji do plików PNG, czego nie robi w przypadku BMP.
Nieskompresowany TGA zachowywał się podobnie do BMP w zakresie rozmiaru pliku przed i po skompresowaniu, podczas gdy kompresja skompresowanego pliku TGA została dodatkowo poprawiona przez ZIP, chociaż nie tak bardzo, jak wersje nieskompresowane.
Warto eksperymentować z innymi algorytmami niż deflacja i innymi ustawieniami siły kompresji. Która kombinacja przyniesie najlepsze rezultaty, prawdopodobnie zależy od stylu twoich tekstur. Możesz również rozważyć porównanie obciążenia gry i mieć wpływ na wydajność dekompresyjną w podejmowaniu decyzji o używanym ustawieniu.
Dolna linia: Jeśli chcesz uniknąć podwójnej kompresji przy zachowaniu niskiej rozmiar pliku, można użyć
PNG
zStore
algorytmem zip lubBMP
z algorytmem kompresji zip.źródło
Nie martw się o to.
Kiedy algorytm „deflacji” zastosowany w plikach .zip napotka blok danych, który jest już dobrze skompresowany, na przykład dane pikselowe obrazu .png, stwierdza, że nie może go skutecznie skompresować i zapisze go jako dosłowny nieskompresowane dane. Kopiowanie tego wymaga bardzo małego obciążenia po zakończeniu dekompresji.
http://en.wikipedia.org/wiki/DEFLATE
źródło
store
zamiastdeflate
oszczędzać czas, a następniedeflate
wszystko do kompilacji wersji.Wygląda na to, że podano już bardzo dobre odpowiedzi, ale pomyślałem, że dam jeszcze jedną:
Rozwiązanie: Nic nie rób.
Uzasadnienie: Nie stwierdzono problemu - tak, kompresujesz informacje dwukrotnie, ale dlaczego się o to martwisz? Czy rozmiar danych jest zbyt duży? Czy dekompresja jest zbyt wolna? Czy jest to mniej lub bardziej ważne niż dziesiątki funkcji, które możesz dodawać, udoskonalać, testować i / lub debugować w tym momencie?
źródło
Jeśli używasz specjalistycznych formatów, takich jak PNG i OGG, nie potrzebujesz kompresji ZIP.
PNG, OGG i inne już skompresowane formaty nie zmniejszą się znacznie, kompresując je ponownie jako ZIP. 100 MB skompresowanych plików PNG to nadal ~ 100 MB.
Skrypty, pliki konfiguracyjne i inne formaty tekstowe znacznie korzystają z kompresji, jednak zazwyczaj są one niewielkie w porównaniu, nie przechowują tak dużej ilości danych. Jeśli twoja gra ma 100 MB, to pliki tekstowe mogą stanowić 1 MB całej gry, nawet jeśli możesz zrobić to 100 KB poprzez kompresję, wygrałeś tylko 900 KB, mniej niż 1%, nie warte wysiłku.
Możesz nawet chcieć użyć systemu plików bezpośrednio zamiast wirtualnego systemu plików opartego na zipie. Ułatwiłoby to łatanie: możesz po prostu zamienić zmodyfikowane pliki.
źródło
.zip
pliku, czy nie. Na przykład na platformie Android.apk
jest to.zip
plik, który może zawierać zasoby.