OTIMIZAÇÃO 101: VERIFICAÇÕES DE COLISÃO E GRUPOS

1

Stats

472 visits, 586 views

Tools

License

This tutorial is licensed under CC BY 4.0. Please refer to the license text if you wish to reuse, share or remix the content contained within this tutorial.

Published on 6 Oct, 2023.

Esse tópico é apenas uma tradução em português do tutorial escrito por Austin Morgan (SunTanK).

Este tutorial aborda várias técnicas para melhorar o desempenho quando você tem muitos objetos, como inimigos e balas.

Se você tiver centenas de sprites, como inimigos ou balas, que fazem referência a vários gatilhos (como colisões de balas com inimigos e temporizadores), você notará que o desempenho será prejudicado, mesmo que as colisões não estejam ocorrendo. Isso se agrava exponencialmente se você estiver fazendo verificações de colisão entre duas famílias! Embora o Construct 2 não verifique colisões com objetos que não existem em uma família, ele verificará se eles e cada objeto oponente existem a cada ciclo.

Por exemplo: se você tiver 50 inimigos em uma família e 20 balas em outra e estiver fazendo uma verificação de colisão entre eles, ele fará uma "verificação de existência" para cada inimigo multiplicado por cada tipo de bala por ciclo, o que pode se tornar um uso ineficiente massivo dos recursos da CPU! 400 inimigos X 50 verificações X 20 balas resultam em 400.000 verificações, mesmo quando as balas não estão presentes e nenhuma colisão está ocorrendo!

Duas possíveis soluções que funcionam em conjunto para evitar isso seriam ter uma variável que informa ao jogo quais armas podem possivelmente existir e, em seguida, verificar cada uma individualmente e também desabilitar o grupo se ele não estiver em uso (ou seja, sem balas presentes). Por exemplo, tenho uma variável de arma que, se definida como 1, permitirá apenas verificações de colisão com aquela arma específica acontecerem.

Isso resolverá apenas parte do problema. O que você ainda precisa fazer é desativar o grupo no início e ativá-lo somente na criação da bala. Em seguida, você deseja desativá-lo novamente quando a contagem de balas cair para 0, para que ele não utilize recursos o tempo todo. (Observação: Todas as minhas balas estão na família chamada 'weap').

Quando fiz essas alterações, percebi imediatamente uma queda de 25% no uso da CPU, e mesmo enquanto as balas estão sendo disparadas, só notei um pequeno aumento de 3%. ISSO É ENORME! Portanto, decidi que era hora de escrever um tutorial e informar a todos sobre isso.

Levando essa técnica de desativação de grupos um pouco mais longe; É uma boa ideia desativar grupos para recursos que seus inimigos podem não estar usando atualmente. Se houver muitas verificações de colisão ou até mesmo temporizadores, você pode querer desativar esses grupos se a colisão ou temporizador neles não estiver sendo usada. Os gatilhos ainda consomem alguns recursos apenas por existirem, e isso se acumula com a quantidade de objetos que você tem atualmente em seu layout.

Por exemplo: eu tinha uma barra de saúde que apareceria acima de um inimigo se você colocasse a mira sobre ele. Essa verificação de colisão aconteceria para cada inimigo na célula de colisão, o que estava consumindo 8% da CPU. Eu decidi que o inimigo mais fraco do jogo realmente não precisava de uma barra de saúde, já que apenas algumas balas o destruiriam de qualquer maneira. Desativei o grupo se os inimigos maiores não estiverem presentes, recuperando assim 8% da CPU!

Não mostrado acima estão os eventos que simplesmente declaram: inimigo ao criar => se a armadura estiver definida como 'leve', desative o grupo de barra de saúde; se a armadura estiver definida como 'pesada', ative-o.

Uma dica final que gostaria de compartilhar é a técnica 'a cada dt*2 segundos'. Para coisas que acontecem regularmente, mas não precisam ser precisas, você pode reduzir o uso da CPU utilizando o dt (que essencialmente significa o tempo que leva para desenhar um quadro) e multiplicando isso por 2. Isso fará com que as condições do evento sejam verificadas a cada dois quadros, reduzindo assim o uso da CPU pela metade.

Na imagem acima, uso essa técnica para redesenhar a largura de um sprite que representa a saúde dos inimigos a cada dois quadros, a fim de economizar recursos da CPU. As aplicações dessa técnica são abrangentes, no entanto, tenha cuidado ao usá-la para coisas que exigem precisão, como balas.

Às vezes, é melhor aceitar a carga nos recursos da CPU para elementos importantes de jogabilidade.

Em conclusão: você pode melhorar muito o desempenho superando certas nuances no sistema de colisão do Construct 2, desabilitando e habilitando grupos apenas quando necessário e evitando fazer verificações de colisão entre famílias de sprites. Lembre-se de usar apenas a CPU que algo precisa repetindo uma verificação com menos frequência usando dt*2 ou, se for realmente impreciso, a cada segundo. Se você não está usando, não desperdice recursos com isso!

Boa sorte a todos! Este é o meu primeiro tutorial, senti-me compelido a compartilhar estas informações, pois achei essas técnicas extremamente úteis!

Austin Morgan (SunTanK)

  • 0 Comments

Want to leave a comment? Login or Register an account!