Fixo vs.variável taxas de quadros em jogos:o que é melhor, e quando?

StackOverflow https://stackoverflow.com/questions/53164

  •  09-06-2019
  •  | 
  •  

Pergunta

Depois de trabalhar por um tempo o desenvolvimento de jogos, eu estive exposta a tanto variável, taxas de quadro (onde você trabalha, quanto tempo se passou desde a última escala e atualização ator movimento nesse sentido) e fixa as taxas de quadro (onde você trabalha, quanto tempo se passou e escolha marcar uma quantidade fixa de tempo ou de suspensão até a próxima janela).

Qual método funciona melhor para situações específicas?Por favor, considere:

  • Para atender às diferentes especificações do sistema;
  • Facilidade de desenvolvimento/manutenção;
  • Facilidade de portabilidade;
  • Desempenho Final.
Foi útil?

Solução

Parece que a maioria 3D desenvolvedores preferem variável FPS:o Quake, Doom e Unreal motores de escala para cima e para baixo com base no desempenho do sistema.

  • No mínimo você tem que compensar muito rápido taxas de quadro (ao contrário de 80 jogos na década de 90, de maneira muito rápida)
  • O seu loop principal deve ser parametrizada pelo tempo de qualquer maneira, e como não é muito tempo, um bom integrador como RK4 deve lidar com a física suavemente Alguns tipos de animação (keyframed sprites) poderia ser uma dor para parametrizar.Código de rede precisará ser inteligente, bem, para evitar que jogadores com máquinas mais rápidas de disparo muitas balas, por exemplo, mas esse tipo de limitação terá de ser feito para compensação de latência de qualquer maneira (a animação parametrização ajudaria a ocultar a latência de rede também)
  • O código de tempo precisará ser modificado para cada plataforma, mas é uma pequena localizada mudança (embora alguns sistemas fazem muito tempo exato difícil, Windows, Mac, Linux parecem ok)
  • Variável taxas de quadro de permitir o máximo de desempenho.Quadro fixo taxas de permitir um desempenho consistente, mas nunca atinge o máximo em todos os sistemas (que parece ser um bloqueio para qualquer jogo sério)

Se você estiver escrevendo uma rede de jogo em 3D onde o desempenho é importante que eu teria a dizer, morder a bala e implementar variável taxas de quadro.

Se é um 2D jogo de quebra-cabeça você provavelmente pode começar afastado com um quadro fixo de taxa, talvez um pouco parametrizadas em super slow computadores e anos próximos modelos.

Outras dicas

Eu inclinar-se para uma variável, a taxa de frames do modelo, mas internamente alguns sistemas estão assinaladas em um tempo fixo.Isto é muito fácil de fazer usando um acumulador.A física é um sistema que é melhor executado em um tempo fixo, e passavam várias vezes por quadro, se necessário, para evitar a perda de estabilidade e manter a simulação suave.

Um pouco de código para demonstrar o uso de um acumulador:

const float STEP = 60.f / 1000.f;
float accumulator = 0.f;

void Update(float delta)
{
    accumulator += delta;

    while(accumulator > STEP)
    {
        Simulate(STEP);
        accumulator -= STEP;
    }
}

Este não é perfeita, por qualquer meio, mas apresenta a idéia básica - existem muitas maneiras de melhorar este modelo.Obviamente, existem problemas a ser resolvido quando a entrada a taxa de quadros é obscenamente lento.No entanto, a grande vantagem é que não importa o quão rápido ou lento a delta é, a simulação está se movendo em um bom ritmo no "player" - que é onde todos os problemas são percebidos pelo usuário.

Geralmente eu não ficam para os gráficos e o áudio do lado de coisas, mas eu não acho que eles são afetados, como a Física, a entrada e código de rede.

Uma opção que eu, como usuário, gostaria de ver mais vezes é alterar dinamicamente o nível de detalhe (em sentido amplo, não apenas o sentido técnico) quando framerates variar fora de um certian envelope.Se você está renderizando a 5FPS, em seguida, desligue bump-mapping.Se você está renderizando em 90FPS, aumentar os sinos e assobios um pouco, e dar ao usuário alguns mais bonita imagens para desperdiçar o seu CPU e GPU com.

Se feito corretamente, o usuário deve obter a melhor experiência de jogo sem ter de ir para a tela de configurações e ajustar-se, e você deve ter para preocupar-se menos, como um designer de nível, sobre manter a contagem de polígonos o mesmo em cenas de diferença.

Claro, digo isso como um usuário de jogos, e não uma grave em que-eu nunca tentou escrever uma tarefa não trivial do jogo.

O principal problema que eu encontrei com comprimento variável de quadro de horários é de ponto flutuante de precisão, e a variável do quadro de vezes que pode surpreendê-lo em como eles mordê-lo.

Se, por exemplo, você estiver adicionando uma moldura de tempo * velocidade para uma posição, e a moldura de tempo é muito pequena, e a posição é muito largo, seus objetos podem abrandar ou parar de mexer-se porque todos os seus delta foi perdido devido à precisão.Você pode compensar isso com um erro separada acumulador, mas é uma dor.

Tendo fixado (ou, pelo menos, um limite inferior no quadro de comprimento) quadro de horários permite que você controle o quanto FP erro que você precisa levar em conta.

A minha experiência é bastante limitado a pouco os jogos de simples (desenvolvido com SDL e C++), mas eu descobri que é muito fácil apenas para implementar um quadro estático taxa.Você está trabalhando com 2d ou 3d jogos?Eu diria que o mais complexo de ambientes 3d iria beneficiar mais de uma variável de taxa de quadro e que a dificuldade seria maior.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top