【问题标题】:Is there an way to run a While loop 60 times a second?有没有办法每秒运行 60 次 While 循环?
【发布时间】:2023-08-18 18:23:01
【问题描述】:

我正在尝试在 Tkinter 中创建一个游戏,并且我希望一个 While 循环每秒只运行 x 次。均匀分布。

我尝试将 1 除以 X 并使用时间模块来等待该数量。但它没有每秒运行 60 次,只有 50 次。

def start(self):
        Frame.__init__(self, self.master)
        self.fpLength = 1 / self.fps
        while True:
            # Code here
            time.sleep(self.fpLength)

我希望代码每秒运行 60 次。但它运行在 55 左右。

【问题讨论】:

  • # Code here 也需要一些时间......而while 语句本身会消耗很少的时间。
  • @hiroprotagonist 是的,这是有道理的。但我知道没有其他方法可以做到这一点。我认为这在 pygame 中是可能的,但我对 Tkinter 更有信心。
  • 作为第一个近似值,您可以测量在循环的每次迭代中到达sleep 语句(使用time.perf_counter)所需的时间,并计算+/- 正确的睡眠时间。 .
  • 如果你没有在线程 time.sleep() 中这样做,那是一个糟糕的选择。事件驱动的 tkinter 将冻结。
  • 只有当您要运行的代码少于 1/60 秒时,您才能每秒运行 60 次。

标签: python while-loop frame-rate


【解决方案1】:

如果您在线程中执行此操作(请参阅我的评论),您可以尝试类似

def start(self):
        Frame.__init__(self, self.master)
        # self.fpLength = 1 / self.fps
        while True:
            # Code here
            clock = time.perf_counter() * 60  #  measer time in 1/60 seconds
            sleep = int(clock) + 1 - clock  #  time till the next 1/60 
            time.sleep(sleep/60)

当然你可以在这里使用 self.fps 而不是常量 60,我只是为了更清晰的 cmets 使用它。

【讨论】:

  • 有没有办法获得一个整数或浮点数,while 循环在那一秒运行了多少次(FPS)? PS:喜欢FPS
  • 创建两个变量,cur_frames 和 cur_second,然后在现有的 while 循环 if int(time.perf_counter())==cur_second: cur_frames +=1 else: cur_frames=0;cur_second=int(time.perf_counter()) 就在 cur_frames=0 之前,你有最后一秒的帧数,随意使用它
最近更新 更多