如何使更新/秒保持不变?

时间:2019-06-05 14:23:51

标签: love2d

据我所知,love.update和love.draw被称为每一帧。您可以关闭vsync(无限制调用love.update)或将其保持打开状态(固定为刷新率)。由于不同的计算机具有不同的刷新率,因此您需要能够支持不同的更新,否则游戏将在不同的计算机上以不同的速度运行。

我可以想到两种解决方案:

  1. Cap UPS。

  2. 在任意UPS上运行。

2有一些问题,所以我认为恒定UPS可能更好。我的计算机的刷新率为57Hz,因此我在代码中使用了它。

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

如果我打开vsync,游戏运行良好,但是如果关闭了vsync,则它会有点抖动,我认为无论其他PC上的vsync,它都可能像这样。有什么方法可以更好地限制UPS的功率,或者我应该只使用解决方案2?

3 个答案:

答案 0 :(得分:0)

似乎您知道如何设置vsync,但这是我在love.load()中用于设置它的代码:

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

在更新循环开始时,我有以下代码:

self.t1 = love.timer.getTime()

这会占用循环开始时的时间,并在循环结束时与以下代码配对:

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

如果您的计算机能够以高于60FPS的速度运行更新,则游戏将在更新循环结束时进入睡眠状态以强制采用恒定的帧频。不幸的是,这仅限制了帧速率(您帖子中的解决方案1)。话虽如此,该方法没有抖动(我已经在多台Windows计算机上进行了测试)。

我相信我从this link获得了这种方法。

答案 1 :(得分:0)

您需要使用dt in update功能, 假设您有一个精灵每帧移动1个像素

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

对于您来说,刷新率为57 fps,精灵会每秒移动57像素,但是其他人会看到每秒移动60像素

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

现在以57 fps的速度播放,您在一秒内调用了57次时间更新,您的精灵将精确移动60像素(60 *(1/57)* 57),而其他以60fps运行的精灵也会看到它移动了60像素( 60 *(1/60)* 60)

使用dt,您正在进行相对于计算时间的计算,而不是相对于帧进行计算,从而完全放弃了问题

答案 2 :(得分:0)

请谨慎使用vsync,因为某些计算机屏幕可以不同的帧速率运行(例如60fps,120fps ...)。即使计算机屏幕以相同的帧速率运行,在love2d中启用vsync也是可以被图形卡设置覆盖的设置。因此,您应该始终考虑使用增量时间(dt)。请参阅@nepta answer以了解应如何使用增量时间。