Desenvolvimento de JogosEstratégiaPlatformersProgramaçãoProjectosRetro GamingShoot 'Em UpShooter HorizontalSoftwaresTopTop 10 Game EngineTop Game EngineVideo Jogos

2025-02-09 – O meu Game Engine em C++ a ocupar apenas 27 MB de memória e com binários de 300K…

Aqui mostro-vos como o meu Game Engine, se funcionar com um jogo de apenas um ecrã, ocupa apenas perto de 20 e tal MB de memória, e poderá ter executáveis de 300 KB de tamanho (onde a chuva está mais optimizada, a neve um pouco menos, e o Orion menos):

2025-02-09 – O meu Game Engine em C++ a ocupar apenas 27 MB de memória e com binários de 300K…

Ah, e o “Orion” com 3% de CPU, e os outros com aquelas milhares de gotas de chuva ou flocos de neve, apenas 12% do CPU, num portátil velho com 4 anos que custou na altura 600 euros pois eu programo sempre com portáteis baratos para me obrigar a fazer as coisas bem.

Tão pouco!

Isto porquê?

Porque tal como referi no meu post anterior (aqui: https://www.goncalo.pt/por/2025/01/29/2025-01-29-o-tamanho-do-executavel-do-meu-game-engine-em-c/) sobre tamanhos de ficheiros binários, ou no post antes sobre memória usada por Game Engines (aqui: https://www.goncalo.pt/por/2025/01/20/2025-01-20-optimizacao-do-uso-de-memoria-90-do-meu-game-engine-em-c-criacao-dos-meus-proprios-containers-e-adaptando-o-para-multi-threading-em-simultaneo/), eu criar o meu próprio Game Engine tem quadriliões de vantagens, como ter binários muito pequenos e ocupar muito pouca memória.

De facto, contei-vos como a simples criação de um único botão, em Game Engines como Unity ou o do Unreal, pode criar binários com centenas de MB de tamanho, e a ocupar centenas de MB de memória, pois esses binários iriam conter Game Engines super “bloated”, cheios de quadriliões de coisas que não necessitamos sempre, bem como iriam encher a memória de todas essas coisas inúteis para quem quer criar jogos ao meu gosto, estilo 2D na maioria.

De facto até vos mostrei o ridículo que é termos hoje em dia “Jogos do Galo” ou “Tetris”, jogos mega-básicos de criar, com 100 MB ou 150 MB de tamanho ou mais:

2025-01-29 - O tamanho do executável do meu Game Engine em C++...
2025-01-29 – O tamanho do executável do meu Game Engine em C++…

Até quem tenta criar jogos com .Net, vê-se agarrado ao problema de ver centenas de MB ocupados pela Framework, além de que os seus binários só seriam relativamente pequenos porque centenas de MB de necessários dados estariam espalhados pelo computador na Framework.

Nos meus exemplos podem ver que tenho, mesmo com uma demo de jogo (não jogável), com milhares de gotas de chuva no ecrã, ou flocos de neve no ecrã, em tempo real, e com todo o meu Game Engine uploadado para a memória, e ainda sem estar optimizado a 100%, eu ocuparia apenas 30 MB de memória (já meti com 25 a 27 antes):

2025-02-09 - O meu Game Engine em C++ a ocupar apenas 27 MB de memória e com binários de 300K...
2025-02-09 – O meu Game Engine em C++ a ocupar apenas 27 MB de memória e com binários de 300K…

Alguém me perguntou porque raios eu não usava já toolkits existentes em vez de criar uma, ou usava game engines existentes em vez de criar o meu, e usaram o termo “recusas-te a andar nos ombros de gigantes”, como podem ver num comentário algures aqui:

https://www.quora.com/Why-are-self-taught-programmers-bad-at-programming/answer/Goncalo-Ferreira-7

Mas a verdade é que se eu andar nesses ombros de gigantes, ou seja, usar Unitys, Unreal, ou toolkits existentes como Qt, GTK, etc, eu iria ter binários gigantes, muito maiores, ocupar mais memória, e não ter as coisas ao meu gosto.

E como eu não tenho pressas e faço isto por gosto, mais vale criar os meus próprios toolkits em vez de usar o Qt ou GTK, e criar o meu próprio Game Engine que me permite ter tudo o que quero e melhor (mais ao meu gosto), ocupando menos memória e com executáveis mais pequenos.

Os exemplos que dei hoje são apenas para mostrar isso.

No outro exemplo que mostrei no post anterior, eu ocupava 200 MB de memória, mas apenas porque com resoluções de 1280*960 com 16 milhões de cores (4 bytes por cada píxel em RGBA), com um nível de 200 por 95 tiles de tamanho, onde calculo em tempo real colisões píxel-a-píxel de cada um dos mais de 100 inimigos do nível mesmo que não os veja num ecrã (posso disparar um “laser” e ele percorre o nível inteiro bate na parede e regressa até mim ao meu ecrã), com dezenas de milhares de objectos a serem calculados em tempo real, como umas 10.000 gotas de chuva e bolhas de ar na água, entre 1001 coisas, ocupar apenas 200 MB de memória não deixa de ser, modéstia à parte, um feito.

Eu poderia meter o mesmo nível de testes, a ser calculado apenas no ecrã visível, com perto de 30 MB, ou menos se mais optimizado ainda, e se reduzir a resolução para 320×200 e meter 256 cores, e cortar mais coisas, fazê-lo até funcionar com uns 100 Kb nos anos 90.

Por isso esses 200 MB que mostrei no nível de Platformer, é porque me dou ao luxo de usar a memória para ter muita coisa (já que hoje em dia todos temos 16 GB ou mais de memória e 200 MB não é nada hoje em dia), não é porque tem de ser.

Pois o meu objectivo é ter retro-games estilo anos 90 mas com todo o poder das máquinas actuais.

Mas sem criar hogs, bloated software como os que vejo onde um jogo simples tem 100 MB ou mais de tamanho, o que é um abuso.

E como expliquei no post anterior, o executável tinha também uns 7 MB ou mais porque tinha incluído dentro dele todos os recursos necessários, como imagens, músicas (MP3 e não outras mais leves como os MOD dos anos 80, etc).

Por isso pronto, o importante é que podem ver que o meu Game Engine, apesar de vir a ser muito mais optimizado um dia, neste momento já cria jogos muito completos que ocupariam 20 MB e tal se for calculado só com um ecrã de cada vez (mesmo que tenha 640×480 de RGBA e milhares de objectos no ecrã), ao contrário de gastar centenas de MB de disco e memória por jogos criados com Game Engines gigantes e bloated ou frameworks pesadas como o .Net.

É o poder do maravilhoso C ou C++. 🙂

Nos exemplos dados, uso alguma compressão ligeira, e é importante referir que podem ver o binário com os recursos fora, ou incluídos no mesmo, ou com as bilbiotecas tipo C++ etc, incluídas no mesmo como estáticas ou fora, sendo que o executável mais pequeno é 100% independente com esse tamanho tendo ali meio MB de tamanho, ou seja, funciona em qualquer lugar sem nenhum recurso externo, com apenas esse ficheiro.

No caso do da neve, ocupa mais uns 20 MB porque a neve tem uma quantidade enorme de algoritmos de Física que fazem com que a neve se consolide, com que ela derreta, com que o calor passe de uns flocos para os outros para ir derretendo, etc, além de que os objectos são mais pesados e ocupam mais memória, etc, etc, e daí ocupar mais um pouco.

Quanto ao Orion, não foi muito optimizado, poderia ocupar ainda menos, dado usar só um ecrã, mas tem também vários scripts que serão usados no jogo de estratégia que quero criar, baseado no velhinho Master of Orion de 1993 (o primeiro).

Tenho estado a partilhar posts sobre optimização por não ter tido tempo hoje em dia com as mudanças de casa para fazer nada mais, quem sabe um dia volte ao meu Game Engine em termos de desenvolvimento e traga mais novidades.

Hasta!

2025-02-09.

Publicado no mesmo dia no LinkedIn, em:

https://www.linkedin.com/posts/goncalopt_o-meu-game-engine-em-c-a-ocupar-apenas-activity-7294451740681158659-m3J_

Post seguinte associado ao meu Game Engine:

2025-02-13 – Exemplo de pequeno bug no meu Game-Engine em C++ que faria inimigos voar com as armas de raios…

Post anterior, associado também ao meu Game Engine, e tamanho de binários do mesmo:

2025-01-29 – O tamanho do executável do meu Game Engine em C++…

E post antes desse, também sobre optimizações:

2025-01-20 – Optimização do uso de memória (-90%) do meu Game Engine em C++ (Criação dos meus próprios containers), e adaptando-o para Multi-Threading em simultâneo…,
2025-01-29 - O Sonic à chuva no meu Game Engine em C++...
2025-01-29 – O Sonic à chuva no meu Game Engine em C++…
2025-02-09 - O meu Game Engine em C++ a ocupar apenas 27 MB de memória e com binários de 300K...
2025-02-09 – O meu Game Engine em C++ a ocupar apenas 27 MB de memória e com binários de 300K…

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!