当前位置: 首页 > 知识库问答 >
问题:

限制循环帧率

段铭晨
2023-03-14

就像pygame一样,我想限制循环的帧速率。Pygame提供Pygame。时间时钟勾选()方法

如果您传递可选的framerate参数,函数将延迟以使游戏运行速度低于给定的每秒滴答数。这可以用来帮助限制游戏的运行速度。通过呼叫时钟。每帧勾选(40)一次,程序的运行速度不会超过每秒40帧。

但是如何在python中以本机方式实现呢?

举例说明:

import time

max_frames = 125 # 25*5
current_frame = 1
while current_frame <= max_frames:
    print('frame', time.clock(), current_frame)
    current_frame += 1

制作:

('frame', 0.01, 1)
('frame', 0.01, 2)
('frame', 0.01, 3)
[...]
('frame', 0.01, 124)
('frame', 0.01, 125)

我希望每秒25帧,所以

('frame', 0.01, 1)
('frame', 0.05, 2)
('frame', 0.08, 3)
[...]
('frame', 4.98, 124)
('frame', 5.00, 125)

共有2个答案

佟颖逸
2023-03-14

假设“本地在python中”意味着使用Python标准库,时间模块确实提供了足够的构建块,但它很可能不是你想要的。帧速率限制的核心是等待合适的时间通过:

from time import time, sleep

fps=5
frameperiod=1.0/fps
now=time()
nextframe=now+frameperiod
for frame in range(120):
  print frame, now
  while now<nextframe:
    sleep(nextframe-now)
    now=time()
  nextframe+=frameperiod

时钟在这里不起作用的原因是它测量处理器时间而不是挂机时间。

然而,这种方法有几个缺陷:

  1. 它不会同步到适当的更新事件(如监视器帧)
  2. 内环可以补偿下冲,但不能补偿过冲
  3. 这里没有应对外部事件的设施

所有这些都是使用更紧密关联或更高级别框架的好理由。例如,将等待时间折叠为select或类似(asyncore或Twisted等主循环的一部分)可以快速响应事件,Kivy可以帮助您制作基于时间的动画,而无需处理帧,Pygame可以在给定适当标志的情况下与监视器同步,并提供均匀间隔的事件(虽然间隔计时器也会这样做,但它们不适用于Windows,需要信号处理)。

羊刚捷
2023-03-14

您可以使用time.sleep(1./25)等待1/25秒。

while current_frame <= max_frames:
    # ... do stuff 
    time.sleep(1./25)

请注意,无论循环体花费多少时间,都将始终额外等待该时间。或者,记住最后一次执行时间并等待到此时1/25秒。

while current_frame <= max_frames:
    start = time.time()
    # ... do stuff that might take significant time
    time.sleep(max(1./25 - (time.time() - start), 0))
 类似资料:
  • 帮助,我对java完全陌生,我正在尝试创建一个循环,该循环将要求用户输入一个数字。如果用户输入的数字以外的任何内容,我想捕获异常并再次尝试获取正确的输入。我用一段时间循环完成了此操作,但是它不会在错误后为用户提供输入任何内容的机会,它循环了除该循环之外的所有内容。请帮助我了解什么是错的,以及正确的方法...谢谢。这就是我所拥有的:

  • hasNext()的定义是“如果此扫描仪的输入中有另一个标记,则返回true。此方法可能会在等待输入扫描时阻塞。扫描仪不会前进超过任何输入。” 当我把 standardInput.hasNext() 放在 for 循环中时,程序会向无穷大运行。但是如果我把它放在 while-loop 中,它不会运行到无穷大。这两个程序之间的区别在哪里,为什么其中一个有效而另一个无效? for循环: while-l

  • 我正在用我的java书复习数据结构,我需要重新创建一个循环链表。我对这个无限循环的链表有问题,弄不清楚为什么。我可以将值插入到列表中,但是打印和删除这些值似乎会无限循环最初插入的值。我如何更改我的List类以避免无限循环? CircularList.Class 链接类

  • 基本上,findNode()搜索其数据等于作为参数插入的字符串的节点,但当我调用outputList()方法(该方法返回屏幕上当前节点的字符串表示)时,它将继续无限循环。 outputList方法是: 如有任何帮助,我们将不胜感激。提前道谢。

  • 问题内容: 为什么我在递归方法中遇到无限循环,而没有机会输入任何符号来破坏它? 如果您尝试创建错误(将字符串值输入键,然后尝试向其添加数字),则您将在控制台中获得无限的“错误”文本,而不是在第一次错误后,程序应再次询问该数字和然后才决定要做什么。 问题答案: 如果失败,则抛出异常,但不使用无效数据。从文档中: 当扫描程序抛出时,扫描程序将不会传递导致异常的令牌,因此可以通过其他方法检索或跳过该令牌

  • 我一直在玩React 16.7-alpha中的新钩子系统,当我处理的状态是一个对象或数组时,我陷入了useEffect中的无限循环中。 首先,我使用useState并用一个像这样的空对象启动它: 然后,在useffect中,我使用setObj再次将其设置为空对象。作为第二个参数,我正在传递[obj],希望如果对象的内容没有改变,它不会更新。但它一直在更新。我猜是因为无论内容是什么,它们总是不同的对