Sto sviluppando un gioco 2D e ho molti sprite. Ho usato animazioni e modelli 3D per renderizzare in 2D, per dare loro l'aspetto di "Fallout" o "Diablo". È anche più facile che disegnare a mano, lol.
Ho già dovuto ridurre il framerate a 15 fps, che era il più basso che potevo abbassare senza farli sembrare mossi. Tuttavia, è stato triste a causa dell'aspetto incredibilmente fluido di 24 fotogrammi.
Ci sono due ragioni per cui ho fatto questo:
1) Ridurre lo spazio su HDD. Meno sono le immagini, più piccolo sarà il mio gioco totale.
2) Riduzione del consumo di RAM. Meno immagini si caricano, più è probabile che io eviti problemi di rigonfiamento della mia limitazione RAM.
Tuttavia, se esistesse un modo per comprimere le immagini sia nello spazio su disco rigido che nella RAM, lo farei. L'ho provato prima e la maggior parte non riceve alcun cambiamento di qualità quando si passa da RGBA8888 a RGBA5555 e solo un piccolo colpo quando si converte in RGBA4444 nel mio programma TexturePacker. Non lo faccio attualmente, perché SFML sembra usare la stessa quantità di memoria indipendentemente dal tipo di immagine .PNG che è. Ho cercato di caricarlo in modo diverso, ma non sono riuscito a trovare nulla sull'argomento.
Ho letto molto su come gestire i videogiochi 2D. Il consenso è travolgente: metti i tuoi Sprite in una trama più grande per grandi prestazioni! Quindi impacco i miei piccoli folletti in un foglio di ingrandimento molto più grande usando TexturePacker.
Tuttavia, ho in programma di avere 10-15 animazioni per personaggio, 5 direzioni di spostamento e 15-40 fotogrammi per animazione (probabilmente una media di 24). Con 15 animazioni, 5 direzioni e una media di 24 fotogrammi per animazione; Cioè 1800 frame individuali per personaggio. Se confezionato in un foglio sprite, sono invece solo 75 immagini. (Un foglio sprite per animazione, per direzione. 15 * 5)
Per l'enorme personaggio del boss nel gioco, non posso usare uno spritesheet e devo programmare un modo per caricare semplicemente un'immagine alla volta. Non so ancora se posso farlo per le prestazioni.
Per i personaggi, li ho già confezionati in un foglio di calcolo. Per un singolo personaggio che cammina, questo sembra funzionare la maggior parte del tempo, anche se a volte si blocca. Tuttavia, lo attribuisco al mio codice mal concepito che scambia trame invece di precaricare tutte le trame per quel personaggio.
Se dovessi precaricare le trame, ha senso per i fogli sprite. Immagino solo che sia una cattiva idea precaricare 1800 piccole immagini per ogni personaggio.
Tuttavia, immagino che riprodurli in streaming e in memoria uno alla volta sarebbe estremamente veloce, quindi avrei solo bisogno di avere una sola immagine in memoria alla volta. Questo non significherebbe che in un dato momento avrei solo ogni personaggio consumare qualche KB invece di 45 + MB?
Immagino che questo ucciderebbe le mie prestazioni, dato che lo streaming dovrebbe essere incredibilmente veloce (15 immagini in entrata e in uscita dalla memoria e dal rendering, al secondo) e sebbene le immagini sarebbero molto piccole, potrebbe essere un'idea migliore caricare fogli di calcolo dei personaggi nella memoria invece. Ma dovrò comunque codificare un sistema di rendering simile a un flusso di immagini singole per il mio personaggio boss più grande.
Ho sperimentato, ma non è un processo semplice. Soprattutto dato il fatto che sto lavorando su altre parti del motore di gioco che al momento non si occupano di grafica.