Object Pooling é uma técnica extremamente utilizado no desenvolvimento de nossos jogos.
Pois, ao criar um jogo, nós programadores precisamos sempre nos preocupar com as melhores práticas de codificação.
E evitar bugs indesejáveis, e para que nossos jogos tenham o máximo de desempenho, em qualquer maquina que seja executado.
Object Pooling: Como lidar com Game Objects?
Os objetos de jogo podem ser um dos inúmeros causadores de quedas de desempenho e FPS de um game.
Pois, precisamos ao longo da gameplay, constantemente criar e destruir objetos.
Por exemplo: balas, inimigos, efeitos especiais, particulas, etc.
E é justamente essa ação de Criar e Destruir que prejudica demais a performance do jogo.
E executar essa ação repetidamente, vai alocar e liberar memória constantemente.
Porém, isso é o que leva a quedas de desempenho ou “engasgos” (stutters) durante o jogo.
E a técnica de “Object Poling” é utilizada em jogos justamente visando evitar problemas de performance.
E consiste em simplesmente manter um conjunto, pré-alocado de objetos reutilizáveis.
Pois, quando um objeto não é mais necessário, em vez de ser destruído, ele é colocado de volta em uma lista.
E pode ser reutilizado posteriormente, e a logica completa passa por estes passos:
Object Pooling: Inicialização:
Durante a inicialização do jogo ou em algum momento antes de precisar dos objetos, é criada uma lista.
E a Lista é preenchida com uma quantidade fixa de objetos.
Por exemplo, no caso dos projéteis, a Lista seria preenchida com um número adequado de objetos de projéteis.
Mas, é importante fazer muitos testes para ter o número exato de projeteis que são usados durante a gameplay.
E assim armazenar na lista um valor extra de projeteis, para evitar bugs.
Reutilização Reciclagem:
Uma forma é ter duas listas: para objetos que estão em cena e para os que poderão ser usados.
E quando um objeto é necessário, em vez de criar um novo, o jogo retira algum disponível na Lista.
E dessa forma ele vai para a cena de jogo e sai da lista de objetos que podem ser usados.
Porém ao fim do ciclo, ele é reciclado e colocado de volta na Lista para ser reutilizado posteriormente.
E dessa forma você economiza processamento evitando usar comandos instantiates e destroys.
Mas principalmente porque todos esses objetos já estão calculados e armazenados.
E com eles fixos na memória, prontos para serem usados a qualquer momento.
Object Pooling: Quando usar?
Faça uma análise do seu projeto e busque identificar nas mecânicas que está criando.
E observe sistemas que instanciam e destroem constantemente objetos durante a gameplay.
E analise cada caso, conforme o funcionamento das mecânicas, para adaptar um Object Polling, e otimizar esse sistema.
Porém existem algumas ocasiões em que a técnica pode ser bem-vinda como:
Elementos de Cenário:
Aqueles elementos de cenário animados, ou não, mas que você usará muitas vezes em seu jogo.
Por exemplo: uma árvore que sair da tela de visão do jogador pode ser reposicionada a frente no cenário.
E até mesmo o próprio parallax é um exemplo da reutilização de um sprite reposicionando ele na cena.
Inimigos:
Em jogos com hordas de inimigos ou spawn dinâmico, pooling pode ser usado.
E assim reutilizar os inimigos quando eles são derrotados ou saem da tela.
Partículas:
Efeitos visuais, como explosões, fogo e fumaça, podem ser gerenciados através do pooling para economizar recursos de CPU e memória.
Props:
Elementos interativos ou destrutíveis no cenário do jogo também podem ser gerenciados por meio do object pooling.
Personagens:
Alguns jogos têm sistemas de customização de personagens trocando skins.
E dessa forma um único NPC, pode se tornar muitos outros, apenas alterando suas características.
Mas, apesar de muito eficiente, apenas esta técnica não vai salvar seu jogo se ele for mal feito.
Pois, você precisa estudar toda a base das boas práticas.
E no fim ao combinar boas práticas, com algumas técnicas de otimização, seu jogo terá uma performance excepcional.
Seja o primeiro a comentar.