1
votes

Comment pouvez-vous rendre les mises à jour / seconde constantes?

Autant que je sache, love.update et love.draw s'appellent chaque image. Vous pouvez désactiver vsync (appels illimités à love.update) ou le laisser activé (fixé au taux de rafraîchissement). Étant donné que différents ordinateurs ont des taux de rafraîchissement différents, vous devez être en mesure de prendre en charge différents ups, sinon le jeu fonctionnera à des vitesses différentes pour différents ordinateurs.

Il y a 2 solutions auxquelles je peux penser:

  1. Cap UPS.

  2. Exécutez à un UPS arbitraire.

Il y a eu quelques problèmes avec 2, donc je pense qu'un UPS constant pourrait être mieux. Le taux de rafraîchissement de mon ordinateur est de 57 Hz, je l'ai donc utilisé dans le code.

function love.update(dt)
  t = t + dt
  while t >= 1/57 do
    t = t - 1/57
    --stuff
  end
end

Le jeu fonctionne bien si j'active vsync, mais s'il est désactivé, alors il est légèrement nerveux et je pense que ce serait probablement comme ça indépendamment de vsync sur d'autres PC. Existe-t-il un moyen de mieux plafonner l'onduleur ou devrais-je simplement utiliser la solution 2?


0 commentaires

3 Réponses :


0
votes

Il semble que vous sachiez comment définir vsync , mais voici le code que j'utilise dans love.load() pour le définir:

self.delta = love.timer.getTime() - self.t1
if self.delta < self.fps then
    -- sleep to maintain 60fps
    love.timer.sleep(self.fps - self.delta)
end
-- calculate frame rate
self.delta = love.timer.getTime() - self.t1
self.frameRate = 1 / self.delta

Au début de ma boucle de mise à jour, j'ai le code suivant:

self.t1 = love.timer.getTime()

Cela saisit l'heure au début de la boucle et est associé au code suivant à la fin de la boucle:

love.window.setMode(1, 1, {vsync = false, fullscreen = true})

Si votre ordinateur est capable d'exécuter la mise à jour à plus de 60 images par seconde, le jeu se mettra en veille à la fin de la boucle de mise à jour pour appliquer une fréquence d'images constante. Malheureusement, cela ne plafonne que la fréquence d'images (solution 1 dans votre message). Cela étant dit, cette méthode fonctionne sans gigue (j'ai testé sur plusieurs machines Windows).

Je crois avoir obtenu cette méthode à partir de ce lien .


0 commentaires

1
votes

vous devez utiliser le dt dans la fonction de mise à jour, disons que vous avez un sprite déplaçant 1 pixel à chaque image

function love.update(dt)
   sprite.x = sprite.x + 60*dt
end

pour vous avec un taux de rafraîchissement de 57 fps, le sprite se déplacera de 57 pixels par seconde, mais d'autres le verraient se déplacer à disons 60 pixels par seconde

function love.update(dt)
   sprite.x = sprite.x + 1
end

maintenant à 57 fps, vous appelez 57 time update en une seconde et votre sprite se déplacerait exactement de 60 pixels (60 * (1/57) * 57), et d'autres fonctionnant à 60fps le verraient également se déplacer de 60 pixels (60 * ( 1/60) * 60)

en utilisant dt, vous effectuez un calcul relatif au temps, et non au cadre relatif, rejetant complètement le problème


0 commentaires

0
votes

Soyez prudent avec vsync car certains écrans d'ordinateur peuvent fonctionner à des fréquences d'images différentes (comme 60fps, 120fps ...). Et même avec des écrans d'ordinateur fonctionnant à la même fréquence d'images, l'activation de vsync dans love2d est un paramètre qui peut être remplacé par les paramètres de la carte graphique. Vous devriez donc toujours envisager d'utiliser le delta-time (dt). Reportez-vous à la réponse @nepta pour savoir comment utiliser le temps delta.


0 commentaires