【问题标题】:Pyglet window don't draw at 60FPS unless the rate of an update function is called in less than 1/60 of a secondPyglet 窗口不会以 60FPS 的速度绘制,除非在不到 1/60 秒的时间内调用更新函数的速率
【发布时间】:2021-10-21 02:21:10
【问题描述】:

于是,我开始利用空闲时间编写一个小游戏,并决定使用一个我以前从未使用过的库:pyglet。我曾经使用 pygame 甚至街机(使用 pyglet 实现),但我认为我应该尝试使用一次 pyglet,特别是因为街机在 python 3.10 中不可用。 所以,实际的问题是,当创建窗口并尝试在上面绘制一些东西时,我注意到图像在闪烁,所以我决定检查我得到了多少 FPS。 下面的代码只是我正在运行的一个测试,试图弄清楚可能发生了什么。

import pyglet

window = pyglet.window.Window(800, 600, vsync=False)
fps_display = pyglet.window.FPSDisplay(window)

# Redundant just to be sure vsync was indeed disabled
window.set_vsync(False)


@window.event
def on_draw():
    window.clear()
    fps_display.draw()

def update(dt):
    print(f"FPS: {pyglet.clock.get_fps()}")

if __name__ == "__main__":
    pyglet.clock.schedule_interval(update, 1.0/60.0)
    pyglet.app.run()

因此,使用这个简单的代码,通过窗口中的 FPSDisplay 我得到大约 30 FPS,但是从检查 pyglet 时钟的更新方法中的打印功能,我得到数百个(或数千个当我在屏幕上移动鼠标时) ,我实际上也觉得很奇怪)FPS。 我尝试在创建窗口时以及通过 set_vsync 函数启用和禁用 vsync,但没有任何改变。唯一使 FPSDisplay(实际上是绘制到窗口的速度)上升的是将更新功能速率设置为低于 1/60(即使 1/70 已经足以达到 60 FPS) .

pyglet.clock.schedule_interval(update, 1.0/70.0)

所以,我在徘徊,这是 pyglet 实际工作的方式还是 vsync 的问题?

【问题讨论】:

  • 1- 即使屏幕上有东西被更新,也会发生这种情况,比如移动精灵,它使图像以 30 FPS 移动,而不是期望的 60 FPS。给定的例子只是我正在做的一个测试。如果这是 pyglet 实际工作的方式,我应该如何让它至少以 60 FPS 的速度绘制东西?
  • 2- 我的问题可能不清楚,对此我深表歉意,所以:为什么仅通过将更新函数的更新速率设置为 1 来实际以 60 FPS 的速度绘制窗口/70 而不是 1/60?
  • 我使用 pyglet Sprite 实例进行测试。尝试在更新函数中直接添加它的 x 值,然后尝试调用它的基本更新函数并传递一个增加的 x 值。它们都导致相同的 30 FPS。当我注意到错误时,我没有尝试使用 key_presses 或其他任何东西。
  • 我认为它也是这些产品线中的一部分,并且正在尝试使用它。从 61.0 到 64.0 它在 40-50 之间波动;从 65.0 到 67.0,它停留在 50 年代以下;从 68 到 60 年代并保持相当稳定。在不移动鼠标或按下任何东西的情况下,即使使用 120.0,它也给了我相同的 60 FPS,但是当移动鼠标时,它会上升到大约 120 FPS。我真的不明白为什么会发生这种情况

标签: python-3.x pyglet


【解决方案1】:

通常,您不希望游戏以最大 FPS 运行而几乎没有任何进展,否则您会无缘无故地使卡超载并浪费 CPU 周期。

基本上,事件循环正在尝试为您优化这一点。为了回答为什么,Pyglet 只会在发生某种事件时更新 FPS。 (这在 Pyglet 2.0 中进行了更改,因为它不是很直观)您可以通过移动鼠标光标来查看这一点,然后看到 FPS 上升。 Windows 正在将事件推送到窗口中,从而使应用程序工作得更多。通过安排更新,您会迫使循环更多地工作,这就是它增加的原因。

如果你想强制最大 FPS 即使使用 vsync 你也可以这样做:

def update(dt):
    pass

pyglet.clock.schedule(update)

通常,一旦您开始添加要求更高的功能和特性,这应该不是问题。

【讨论】:

  • 好的,现在它确实更有意义了。感谢您的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多