Opracowuję grę, taką jak Age of Empire (budynki na mapie), a do każdego budynku mam arkusz duszka do jego animacji. Korzystam z animacji klatka po klatce, aby animować budynek (i tak nie znam żadnej innej metody). Zauważam, że mój folder zasobów staje się bardzo duży z powodu umieszczanych w nim obrazów.
W jaki sposób gry takie jak CoC i Age of Empires utrzymują rozmiar apk poniżej 50 Mg? Czy coś mi brakuje, jeśli chodzi o tworzenie gier?
Dziękuję Ci
EDYCJA: Więcej informacji na temat problemu, przed którym stoję
Mam dużo animowanych obiektów rysowanych. Wybrałem tę drogę, ponieważ była najszybsza i przynosiła oczekiwane rezultaty. Zasadniczo każdy budynek jest rysunkiem animacji, w którym jego plik xml odnosi się do 8 rysunków (8 obrazów = 8 plików). Wszystkie z nich są PNG ze względu na przejrzystość. Ponieważ mam ponad 200 obrazów, rozmiar pliku apk wynosi 120 MB (i nie skończyłem jeszcze kopiować połowy plików). Właśnie dlatego musi istnieć sposób na rozwiązanie tego problemu. Pomóż innym programistom
Odpowiedzi:
Pytanie nie jest jasne, czy naprawdę chcesz znać techniki, które pozwalają grom zaoszczędzić miejsce na dysku, nawet jeśli masz duże ilości ciężkich plików graficznych / zasobów (to jest sedno pytania), czy też po prostu chcesz wiedzieć, czy istnieje mniej sposobów na animację budynków, które wymagają dużej ilości miejsca na dysku (tak sugeruje tytuł pytania).
Dlatego umieszczę tę odpowiedź tutaj, starając się pomóc w oszczędzaniu miejsca, gdy masz dużo zdjęć. Jeśli interesuje Cię tylko wiedza na temat technik animacji, które mogą pozwolić Ci zaoszczędzić miejsce na dysku, daj mi znać, a następnie mogę usunąć odpowiedź.
To powiedziawszy, w podobnej sytuacji dwa rozwiązania, które widziałem (i użyłem raz) pod względem oszczędzania miejsca na dysku, to:
1) w celu połączenia poszczególnych obrazów w ramach tego samego obrazu. Czasami może być pomocna. Zamiast zapisywać 4 oddzielne pliki dla każdego z następujących kolorowych kwadratów, zapisuję je wszystkie obok siebie na tym samym obrazie (i dzielę je tylko za pomocą kodu gry):
W tym przykładzie zapisanie każdego z 4 różnych plików PNG wynosi 1255 bajtów, a pojedynczy plik ze wszystkimi połączonymi plikami to 451 bajtów. Oczywiście, ile może to pomóc, zależy od przypadku i powinieneś przetestować, czy może ci to pomóc w zależności od twoich zdjęć.
2) aby skompresować folder zasobów. Często może to być bardzo pomocne w celu zaoszczędzenia miejsca na dysku. Następnie, gdy gra jest uruchomiona, dekompresujesz lub pobierasz żądany obraz ze skompresowanego pliku - w zależności od używanego formatu kompresji. Zobacz poprzednią odpowiedź, która stała się wiki tej witryny: /gamedev//a/37649/72423
Pamiętaj jednak, że każdy rodzaj kompresji może być mniej lub bardziej korzystny w zależności od używanego typu pliku obrazu : Unikaj podwójnej kompresji zasobów
Więcej informacji na temat kompresji: najnowocześniejsza kompresja obrazu?
Na koniec możesz również zastanowić się, jakiego rodzaju obrazu użyć w każdej sytuacji: Który format obrazu jest bardziej wydajny pod względem pamięci: PNG, JPEG lub GIF?
źródło
Proponuję wypróbowanie TexturePacker
Czy korzystasz ze środowiska programowania gier, takiego jak AndEngine, Cocos2d-x lub LibGdx? => Brak
Czy potrzebujesz wszystkich zdjęć ładowanych jednocześnie? Wygląda na to, że napotkasz ogromne problemy z pamięcią RAM na urządzeniach docelowych.
Aktualizacja: Snake przesłał mi kilka zdjęć. Jak obiecałem, nie opublikuję ich tutaj, więc sam stworzyłem sztukę, aby zademonstrować, jak zmniejszyć zużycie pamięci.
Na oryginalnym obrazie poruszała się tylko jedna część obrazu. Umieściłem ptaka w domu, aby to zademonstrować:
Zasadniczo upakowanie całej animacji na arkuszu jest dużym marnotrawstwem pamięci. Powinieneś podzielić części statyczne i ruchome:
Statyczny:
Anim01:
Anim02:
Zachowaj pierwotną pozycję ptaka na zdjęciach . Właśnie dlatego jest tak pusta przestrzeń powyżej. Potrzebujesz tego do wyrównania animacji.
Teraz przeciągnij obrazy na TexturePacker i wybierz następujące parametry
W rezultacie otrzymujesz teraz 2 pliki: arkusz sprite i plik opisu JSON.
Ważnymi częściami są rama i spriteSourceSize .
Rama daje lokalizację oryginalnego ikonki w arkuszu ikonki.
spriteSourceSize daje przesunięcie do rysowania obrazu - części obrazu, które zostały pominięte z powodu przycinania:
Prosta procedura rysowania pseudokodu wygląda następująco:
Może być konieczne dostosowanie obliczenia przesunięcia w zależności od punktu obrotu / początku w systemie graficznym. Powyższa procedura zakłada układ współrzędnych, którego początek znajduje się w lewym górnym rogu.
Następnie po prostu narysuj dom w 2 przejściach:
Nie musisz przejmować się przesunięciami - ponieważ obrazy są już wyrównane.
źródło
Oto kilka wskaźników, których możesz użyć
Mam nadzieję, że te wskazówki pomogą
PS Daję ogólny pomysł, ponieważ nie jestem świadomy twojej dokładnej zawartości gry i przepraszam, jeśli te wskazówki nie są przydatne
źródło
Wiele gier nie utrzymuje swoich zasobów graficznych w .apk; obejmują one tylko „podstawy”, takie jak grafika interfejsu użytkownika i kod gry, a resztę zasobów można pobrać po zainstalowaniu gry. Jest to szczególnie prawdziwe w przypadku gier, które używają różnych zasobów graficznych w zależności od rozdzielczości ekranu, aby plik .apk nie musiał zawierać zasobów o niskiej i wysokiej rozdzielczości.
Powinieneś przyjrzeć się obu opcjom optymalizacji dostarczonym przez innych użytkowników, a także temu, czy ostatecznie będziesz musiał obsługiwać grafikę swojej gry osobno od samego .apk.
źródło
Przyszedłem na tę stronę w poszukiwaniu podobnego pytania i rzeczywiście istnieje kilka dobrych zasobów wskazanych zarówno w odpowiedziach na twoje pytanie, jak i na inne pytania.
Prawdopodobnie powinieneś rzucić okiem na animację 2D: Animowane modele 3D lub duszki z ramkami animacji? na jakąś debatę na temat różnych rodzajów animacji. Pomogło mi to zoptymalizować grę. Ponadto nie informujesz nas, którego interfejsu API używasz ani jakiego silnika używasz. Samo to może zrobić różnicę: Android klatka po klatce animacja PNG
Poza tym pamiętaj, że jeśli pójdziesz drogą kompresji, mogą istnieć istotne różnice między sposobem kompresji. W szczególności istnieje wiele różnic między rodzajami kompresji i toczy się specjalistyczna debata na temat najbardziej odpowiedniej trasy dla urządzeń mobilnych. Zwłaszcza jeśli weźmiesz pod uwagę, że w przypadku urządzeń mobilnych najważniejsze jest użycie pamięci RAM i marnowanie procesora podczas ładowania. Zobacz: http://www.gamasutra.com/blogs/AlexandruVoica/20130419/190833/Why_efficiency_is_key_in_texture_compression_standards_for_mobile_graphics.php?print=1
źródło