Desenvolvimento de JogosDesign 6 Game EngineLabirintosPlatformersProgramaçãoProjectosRetro GamingShoot 'Em UpShooter HorizontalSoftwaresTopTop 10 Game EngineTop Game EngineVideo Jogos

2023-03-19 – Novo Sistema de Manipulação de Tilesets para o meu Game Engine em C++…

O passo seguinte que me ocorreu, foi criar sistemas de manipulação de tilesets, pois eu precisava de algo que me pudesse dividir uma imagem pré-desenhada de um jogo, como o mapa do Batman the Movie da Ocean de 1989 (versão Amiga) que uso no nível de testes do meu Game Engine, em vários tiles para usar nos jogos:

2023-05-19 - Novo Sistema de Manipulação de Tilesets para o meu Game Engine em C++...
2023-05-19 – Novo Sistema de Manipulação de Tilesets para o meu Game Engine em C++…

Acima podem ver vários exemplos de divisão do mapa de tiles, o mapa do nível aliás, em vários tiles.

Tudo começa ao ser desenhado o 1º nível do jogo Batman the Movie de 1989, da Ocean (versão Amiga):

Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine...
Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine…

Seria um desperdício de espaço guardar a imagem assim por inteiro, o que ocuparia uns 20 MB de tamanho.

Por isso criei o software para dividir o mapa em tiles de qualquer tamanho, por exemplo de 32×32 píxeis, e eliminando os repetidos, para poupar espaço:

Unordered tiles (32x32) from Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine...
Unordered tiles (32×32) from Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine…

Mas isto não é o ideal, pois o ideal seria que os tiles mais próximos (mais semelhantes), estivessem juntos, para facilitar a compressão e ocuparmos assim menos memória ao armazenar o tileset no jogo em si.

Por isso na 2ª imagem da imagem de topo, ou a seguinte abaixo, já podemos ver estes tiles ordenados, onde o meu software tentou manter os mais semelhantes juntos, de forma a que pudessem ser melhor comprimidos mais tarde pelo Game Engine e poupar assim espaço no ficheiro binário e na memória:

Tiles (32x32) from Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine...
Tiles (32×32) from Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine…

Como podem ver, os tiles semelhantes estão mais próximos, e isto facilita à compressão, o meu software trata de os juntar consoante sejam mais semelhantes uns aos outros, quer em formas quer em cores.

Neste caso 32 píxeis é bom, mas vou mostrar outros exemplos.

Com 64 píxeis não teria sentido, pois perder-se-ia espaço inutilmente:

Tiles (64x64) from Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine...
Tiles (64×64) from Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine…

Acima há um enorme desperdício de memória, pois forçamos a que cada tile tenha 4 tiles de 32 píxeis, e por isso ficamos com um número gigante de combinações de tiles, e em vez de termos tudo em 10 a 20 Kb, teremos algo de 150 KB, e com muito mais tiles.

Só o meti a título de exemplo.

Deixo um exemplo de como ficaria com 16 píxeis cada tile:

Tiles (16x16) from Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine...
Tiles (16×16) from Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine…

Fica menos compreensível, mas poupa-se espaço pois notamos que os tiles de 32×32 píxeis, eram compostos por vários de 16×16 píxeis iguais, e conseguimos assim ter ainda menos tiles, que misturados, constroem os de 32×32 que usamos no jogo.

Com isto poupa-se memória e espaço no disco.

Vamos reduzir ainda mais para 8×4 píxeis:

Tiles (8x8) from Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine...
Tiles (8×8) from Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine…

E para 4×4 píxeis:

Tiles (4x4) from Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine...
Tiles (4×4) from Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine…

E ainda para 3×3 píxeis por cada tile:

Tiles (3x3) from Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine...
Tiles (3×3) from Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine…

Vamos ver o tamanho que cada um ocupa:

Vejamos quanto ocupa de disco cada um:

2025-03-19 - Espaço ocupado no disco por tilesets de diferentes tamanhos, do primeiro nível do jogo Batman the Movie 1989 (Amiga Version), da Ocean...
2025-03-19 – Espaço ocupado no disco por tilesets de diferentes tamanhos, do primeiro nível do jogo Batman the Movie 1989 (Amiga Version), da Ocean…


Como podem ver, o de 64 píxeis é um desperdício, pois está a fazer combinações de vários tiles de 32×32 (os originais), o que faz gastar espaço estupidamente.

O de 32×32 píxeis original, ocupa 21 KB.

O de 32×32 píxeis ordenado consoante a sua semelhança, já baixou para 16.6 KB, porque isso facilita os algoritmos de compressão deflate usados pelo formato de compressão PNG.

O de 16×16 píxeis, já baixa para 14 KB, o de 8×8 píxeis para 12 KB.

E o de 4×4 píxeis para 3 KB!!!

Parece brutal não? Mas… Errado!

Cuidado, pequeno demais é mau, pois teremos um número cada vez maior de tiles, e isso levará a que tenhamos índices enormes.

Porque o de 4×4 píxeis faria com que o índice de tiles fosse tão grande (pois o nível de jogo teria um índice de tile por cada 3×3 píxeis do mapa), que apesar de a imagem ficar muito pequena, o índice seria gigante!

O de 3×3 píxeis estranhamente fica maior, com 22 KB, e isto porque são tantas combinações diferentes, que o espaço sobe, e o índice seria astronomicamente maior.

Daqui só teria sentido usar entre 8×8 a 32×32, sendo talvez o melhor o de 16×16, se tivermos em conta os índices.

Partilharei mais tarde algo sobre estes índices, hoje é só para verem os meus algoritmos de eliminação de duplicados e ordenação de tiles consoante a sua semelhança.

O meu próprio passo será a construção dos índices.

Depois criar um algoritmo de compressão só meu que comprima mais do que o deflate e outros usados por programas como os Zips.

E mais tarde um formato de imagem meu que permita guardar as mesmas no meu Game Engine, com compressões máximas.

Mais tarde trago notícias sobre isto, tenho tido pouco tempo.

Mas espero que tenham gostado desta nova etapa no meu Game Engine. 🙂

Qualquer dúvida já sabem que me podem apanhar (ocasionalmente) no meu LinkedIn.

Até à próxima!

2025-03-19.

Partilhado no dia seguinte (2024-05-20) no meu LinkedIn, em:
https://www.linkedin.com/posts/goncalopt_programming-cpp-gameengine-activity-7308444916836089858-bqvC

Post seguinte associado ao meu Game Engine:

(A ser colocado um dia).

Post anterior associado ao meu Game Engine, neste caso à redução do uso de memória pelo mesmo:

2025-02-27 – Redução da memória de 200 MB para 61 MB no nível mais pesado de testes, no meu Game Engine em C++…
Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine...
Batman the Movie 1989 from Ocean (Amiga Version), First Level Map, used on my Cpp Game Engine…
2023-05-19 - Novo Sistema de Manipulação de Tilesets para o meu Game Engine em C++...
2023-05-19 – Novo Sistema de Manipulação de Tilesets para o meu Game Engine em C++…

Leave a Reply

Your email address will not be published. Required fields are marked *

RSS
Follow by Email
LinkedIn
LinkedIn
Share
URL has been copied successfully!