UPS e FPS - O que devo limitar e por quê?

11

Atualmente, estou escrevendo um jogo usando C ++ e SDL2 e há uma coisa que me pergunto: faz sentido limitar meus quadros por segundo (FPS) e / ou minhas atualizações por segundo (UPS)?

Tenho a ideia de que, se você limitar o no-break, você basicamente controla a velocidade do jogo - se o jogador se move 1px por atualização e você sempre o atualiza 30 vezes por segundo, ele se move a uma velocidade de 30px / se você provavelmente também aliviará a CPU, pois a quantidade de cálculos por segundo diminui. Se você limitar o FPS, a quantidade de chamadas por segundo diminui e, portanto, você libera sua GPU. Espero ter entendido tudo corretamente, se não, sinta-se à vontade para me corrigir.

Minha pergunta é - o que devo limitar no meu jogo? FPS? UPS? Ambos? Nem? Existe outra abordagem melhor para isso? Como isso é feito na maioria dos jogos e por quê?

As respostas são muito apreciadas!

DocCoock
fonte
2
Não é realmente uma resposta, mas você pode encontrar este útil: gafferongames.com/game-physics/fix-your-timestep
Cypher

Respostas:

10

Sim, isso faz sentido.

Como você disse, isso causará menos carga no sistema, o que é bom para térmicas e outras aplicações.

No entanto .... Sua lógica de jogos NÃO deve depender das atualizações por segundo. Portanto, recomendo que você dê uma olhada no deltatime, que tornará seu jogo independente das atualizações por segundo.

Eu recomendo que você dê uma olhada nesta pergunta. Explica muito bem como calcular e usá-lo. Como obter e usar o tempo delta

Espero que tenha ajudado!

KaareZ
fonte
Então, devo limitar os dois ou apenas um deles?
DocCoock 6/06/15
Ambos, mas adicione uma opção nas configurações para ajustar.
KaareZ 06/06
5
Uma palavra de cautela: se você usa um mecanismo de física, não confie no tempo delta / no quadro de atualização variável, pois eles raramente são suportados; eles exigem a abordagem de quadro fixo. E se o seu quadro flutuar muito, isso pode significar que você tem problemas com o seu software e deve se perguntar por que isso acontece. Diante disso, você pode reconsiderar o uso da abordagem DT.
Vaillancourt
1
Observe que o uso de atualizações com base no tempo delta pode levar à instabilidade física e a erros de reprodução muito difícil. Em alguns jogos, existem truques que são possíveis apenas em determinadas taxas de quadros. É por isso que a física geralmente roda a uma taxa de quadros fixa. Você sempre pode interpolar a taxas mais baixas de atualização, mas se a sua simulação for instável, nada poderá ajudá-lo.
Dietrich Epp
1
Honestamente, acho que deltatime não é uma boa ideia. Eu o uso há anos e vem com dois grandes problemas. Muitos artigos diferentes para vários jogadores recomendam o uso de etapas de tempo fixo e, se o tempo de atraso for muito alto, você poderá se teletransportar através de paredes ou bugs semelhantes, a menos que leve isso em consideração.
Programmdude
6

A melhor resposta é: depende .

Você não precisa limitar nem um

Atualizações : se suas atualizações não estiverem vinculadas a um limite superior, a lógica do jogo deve depender de um tempo delta , para evitar a execução do jogo mais rápido ou mais devagar, dependendo da máquina em que está sendo executado. Essa é uma abordagem muito comum usada por muitos jogos, mas não é a única.

Renderização : Se a renderização não estiver vinculada a um limite superior, o buffer de estrutura poderá ser apresentado em um estado incompleto ou incorreto, causando artefatos rasgantes . É por isso que muitos jogos empregam sincronização vertical (v-sync)

Você pode limitar ambos

Atualizações : alguns jogos usam timestados fixos para alguns ou todos os seus sistemas de jogo. Essa abordagem funciona exatamente como você descreveu. O número de atualizações por segundo é limitado a um limite superior para garantir que as coisas não se movam muito rapidamente em uma máquina de primeira linha. Isso elimina a necessidade de tempo delta. Alguns aplicativos são melhores com timestados fixos, outros com tempo delta. A escolha de qual abordagem dependerá inteiramente do que exatamente você está tentando alcançar. O livro online GameProgrammingPatterns possui um capítulo dedicado aos loops de jogos que abordam as duas arquiteturas.

Renderização : os quadros por segundo devem ser definidos como um limite superior para evitar o problema de laceração mencionado anteriormente; no entanto, seu aplicativo não deve tentar fazer isso manualmente com algum bloqueio da CPU. Em vez disso, ative o v-sync e deixe o hardware subjacente sincronizar com a taxa de atualização do monitor. Ao fazer isso, seu jogo será compatível com futuros monitores que podem operar com uma frequência muito maior do que os atuais 60Hz comuns. Também vale a pena notar que muitos jogadores, em particular aqueles que fazem benchmarking, ainda preferem rodar sem v-sync para permitir a maior taxa de quadros possível. Portanto, é sensato permitir ativar ou desativar o recurso durante o tempo de execução.

O que você não deve limitar

Se o seu jogo usar uma abordagem baseada em pesquisas para entrada do usuário, por exemplo: chama uma getInput()espécie de para atualizar os estados do controlador durante a etapa de atualização, então isso é melhor, se não limitado. Ou, se limitado, defina um limite superior muito alto. Quanto mais você consultar a entrada do usuário e agir sobre ela, mais responsivo e suave o jogo "sentirá". Os chamados jogos de 60Hz que ouvimos hoje em dia não estão atualizando a IA e todos os estados do mundo nesse ritmo, alguns nem sequer são tão rápidos, mas consultam a entrada do controlador pelo menos 60 vezes por segundo e atualizam o avatar do jogador de acordo. Concedido que isso é realmente relevante apenas para jogos de ação rápidos.

glampert
fonte
Minhas atualizações também são automaticamente limitadas quando o VSync está ativado. Portanto, aparentemente eu tenho que decidir entre o problema de laceração e o problema de atualização de sondagem, correto?
DocCoock
@DocCoock, se a lógica do renderizador e do jogo for executada no mesmo encadeamento, sim, ativar o v-sync também corrigirá a frequência da atualização. Essa é uma das razões pelas quais alguns jogos segregam renderização e lógica do jogo em diferentes segmentos.
glampert
1

Você pode dar uma olhada em duas postagens:

Corrija seu Timestep

Renderização física interpolada

Acho as discussões nas postagens realmente inestimáveis, mas, na minha opinião, faz mais sentido quando há uma quantidade importante de simulação de física no jogo. Em resumo, a idéia é que a simulação tenha uma etapa de tempo fixa (caso contrário, a física poderá explodir em algum momento em que o delta seja muito grande), enquanto a renderização deverá ter liberdade para rodar na velocidade máxima possível. Para sincronizar ambos (a simulação e a renderização), o estado de renderização é interpolado por um fator que depende da distância da simulação da atualização a seguir (lembre-se de que a simulação é fixa).

Espero que ajude.

Francis Moy
fonte