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

Wasley Fagundes

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:

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

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar