Zajmuję się tworzeniem gier 2D i mam wiele duszków. Użyłem animacji i modeli 3D do renderowania w 2D, aby nadać im wygląd „Fallout” lub „Diablo”. Jest to również łatwiejsze niż ręczne rysowanie, lol.
Musiałem już zmniejszyć liczbę klatek na sekundę do 15 klatek na sekundę, co było najniższym wynikiem, jaki mogłem obniżyć, nie powodując, że wyglądają na nierówne. Było to jednak smutne z powodu niewiarygodnie gładkich 24 klatek.
Są dwa powody, dla których to zrobiłem:
1) Ogranicz miejsce na dysku twardym. Im mniej obrazów, tym mniejsza będzie moja całkowita gra.
2) Ogranicz zużycie pamięci RAM. Im mniej obrazów do załadowania, tym bardziej prawdopodobne jest, że uniknę problemów z powiększaniem mojego ograniczenia pamięci RAM.
Gdyby jednak istniał sposób na kompresowanie obrazów w przestrzeni HDD i pamięci RAM, zrobiłbym to. Testowałem to już wcześniej i większość nie otrzymuje żadnej zmiany jakości przy nadawaniu z RGBA8888 na RGBA5555 i tylko niewielki hit przy konwersji na RGBA4444 w moim programie TexturePacker. Obecnie nie robię tego, ponieważ SFML wydaje się używać tej samej ilości pamięci, niezależnie od tego, jaki to jest typ obrazu .PNG. Zastanawiałem się, jak inaczej to załadować, ale nie znalazłem nic na ten temat.
Dużo czytałem o tym, jak radzić sobie z grami 2D. Konsensus jest przytłaczający: spakuj swoje duszki w większą teksturę, aby uzyskać doskonałą wydajność! Więc pakuję moje małe duszki do znacznie większego arkusza za pomocą TexturePacker.
Jednak planuję mieć 10-15 animacji na postać, 5 kierunków ruchu i 15-40 klatek na animację (prawdopodobnie średnio 24). Z 15 animacjami, 5 kierunkami i średnio 24 klatkami na animację; To 1800 pojedynczych klatek na znak. Jeśli zapakowane w arkusz sprite, to tylko 75 obrazów zamiast tego. (Jeden arkusz duszka na animację, na kierunek. 15 * 5)
W przypadku jednej ogromnej postaci bossa w grze nie mogę użyć arkusza sprite i muszę zaprogramować sposób, aby po prostu załadować jedno zdjęcie na raz. Nie wiem jeszcze, czy mogę to zrobić dla wydajności.
Dla postaci już spakowałem je do arkusza sprite. W przypadku pojedynczej postaci, która chodzi, wydaje się, że działa to przez większość czasu, chociaż czasami zwleka. Jednak przypisuję to mojemu źle opracowanemu kodowi, który zamienia tekstury zamiast wstępnie ładować wszystkie tekstury dla tego znaku.
Gdybym miał wstępnie załadować tekstury, ma to sens dla arkuszy sprite. Wyobrażam sobie tylko, że to zły pomysł, aby wstępnie załadować 1800 małych obrazów dla każdej postaci.
Jednak wyobrażam sobie, że przesyłanie ich do pamięci i do pamięci pojedynczo byłoby niezwykle szybkie, więc musiałbym mieć tylko jeden obraz w pamięci na raz. Czy to nie znaczy, że w danym momencie każda postać zużyłaby tylko kilka KB zamiast 45 + MB?
Wyobrażam sobie, że zabiłoby to moją wydajność, ponieważ przesyłanie strumieniowe musiałoby być niezwykle szybkie (15 obrazów wchodzących i wychodzących z pamięci i renderowanych na sekundę) i chociaż obrazy byłyby bardzo małe - lepszym pomysłem może być ładowanie arkuszy postaci zamiast tego do pamięci. Ale i tak będę musiał kodować system renderowania podobny do strumienia pojedynczego obrazu dla mojej większej postaci bossa.
Eksperymentowałem, ale nie jest to prosty proces. Zwłaszcza, że pracuję nad innymi częściami silnika gry, które obecnie nie zajmują się grafiką.