Timer Vs Desempenho.
22/10/2023
0
Estou programando um pequeno jogo de naves em 2d, (incentivando meu filho no desenvolvimento) e tenho uma duvida, muitos dos controles de naves inimigas, disparos e outros são feitos em Timer, para melhor desempenho, gostaria de saber se é melhor eu colocar tudo em um único timer, ou coloco um timer para cada tarefa?
Wasley Fagundes
Curtir tópico
+ 0
Responder
Posts
23/10/2023
Emerson Nascimento
não só pelo desempenho, mas pelo "encapsulamento", o timer das naves inimigas deveria ficar em seu próprio escopo.
Responder
24/10/2023
Arthur Heinrich
Existem diversas arquiteturas para o desenvolvimento de jogos. Utilizar um Timer é uma delas.
Porém, é importante você saber que o componente Timer funciona à base de eventos. Nem sempre a aplicação está tratando de eventos e o evento pode não ocorrer com o intervalo de tempo que você espera.
Talvez uma abordagem diferente seja melhor, dependendo do aspecto envolvido.
Imagine que você desenvolva uma interface, que implemente uma função para desenhar o cenário em um determinado instante.
Você pode implementar um loop do tipo:
Desta forma, você pode comparar, internamente à função DisplayFrame(), quanto tempo se passou entre o frame anterior e o atual, gerando um dt (delta de tempo).
Se você estiver em uma máquina mais rápida, provavelmente registrará tempos (dt) menores, permitindo mais frames/segundo. Já em computadores mais lentos, terá tempos maiores.
A ideia é que os personagens sempre se movimentem de acordo com o tempo real, considerando o "dt" e não em função de um Timer, que pode não ocorrer na frequência que você deseja.
Outra melhoria pode ser criar uma função "CheckControls", que verifique quais teclas estão pressionadas, para acionar os movimentos, ao invés de utilizar os eventos onKeyPress, onKeyDown e onKeyUp. Eles são eventos sujeitos à repetição do teclado.
Controlar o tempo que a tecla permaneceu pressionada pode lhe dar maior controle dos movimentos.
Assim, se a tecla de movimento para a direita estiver pressionada, você aciona o movimento por "dt" tempo e não por evento de pressionamento.
Sempre considere o "dt" entre um frame e outro para calcular todos os movimentos e a jogabilidade será a mesma, sempre.
Porém, é importante você saber que o componente Timer funciona à base de eventos. Nem sempre a aplicação está tratando de eventos e o evento pode não ocorrer com o intervalo de tempo que você espera.
Talvez uma abordagem diferente seja melhor, dependendo do aspecto envolvido.
Imagine que você desenvolva uma interface, que implemente uma função para desenhar o cenário em um determinado instante.
Você pode implementar um loop do tipo:
while (not done) do begin Time:=GetTime; (* Função fictícia que retorne o tempo em segundos, com ponto flutuante (precisão de centésimos ou milésimos de segundo) *) DisplayFrame(Time); CheckControls; Application.ProcessMessages; // Sleep(1); (* Você pode utilizar um sleep de 1ms para impedir que sua CPU fique em 100% de uso *) end;
Desta forma, você pode comparar, internamente à função DisplayFrame(), quanto tempo se passou entre o frame anterior e o atual, gerando um dt (delta de tempo).
Se você estiver em uma máquina mais rápida, provavelmente registrará tempos (dt) menores, permitindo mais frames/segundo. Já em computadores mais lentos, terá tempos maiores.
A ideia é que os personagens sempre se movimentem de acordo com o tempo real, considerando o "dt" e não em função de um Timer, que pode não ocorrer na frequência que você deseja.
Outra melhoria pode ser criar uma função "CheckControls", que verifique quais teclas estão pressionadas, para acionar os movimentos, ao invés de utilizar os eventos onKeyPress, onKeyDown e onKeyUp. Eles são eventos sujeitos à repetição do teclado.
Controlar o tempo que a tecla permaneceu pressionada pode lhe dar maior controle dos movimentos.
Assim, se a tecla de movimento para a direita estiver pressionada, você aciona o movimento por "dt" tempo e não por evento de pressionamento.
Sempre considere o "dt" entre um frame e outro para calcular todos os movimentos e a jogabilidade será a mesma, sempre.
Responder
Clique aqui para fazer login e interagir na Comunidade :)