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!
Respostas:
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!
fonte
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.fonte
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.
fonte