FPS - 如何通过将计数除以时间函数来确定 FPS

21
我有一个计数器正在工作,它可以计算每个帧。 我想做的是将此除以时间以确定程序的FPS。 但我不知道如何在Python中对计时函数执行操作。
我已经尝试将时间初始化为
fps_time = time.time 
fps_time = float(time.time)
fps_time = np.float(time.time)
fps_time = time()

计算fps的方法如下:

FPS = (counter / fps_time)
FPS = float(counter / fps_time)
FPS = float(counter (fps_time))

但是我得到的错误是“对象不可调用”或“不支持的操作数/:'int'和'buildin functions'”

提前感谢您的帮助!


如果你收到了这个错误,那么counter必须是一个函数(顺便说一句,请分享错误信息)。你可以检查print type(counter)来知道它的数据类型。 - Arount
5个回答

55
  • 这里有一种非常简单的方法,在每帧中打印您程序的帧率(不需要计数器):

import time

while True:
    start_time = time.time() # start time of the loop

    ########################
    # your fancy code here #
    ########################

    print("FPS: ", 1.0 / (time.time() - start_time)) # FPS = 1 / time to process loop
  • 如果您想要在x秒内获得平均帧率,您可以这样做(需要计数器):

  • import time
    
    start_time = time.time()
    x = 1 # displays the frame rate every 1 second
    counter = 0
    while True:
    
        ########################
        # your fancy code here #
        ########################
    
        counter+=1
        if (time.time() - start_time) > x :
            print("FPS: ", counter / (time.time() - start_time))
            counter = 0
            start_time = time.time()
    

    希望这能帮到你!


    1
    如果这个答案对你有帮助,请考虑接受它。 ;) - Elouarn Laine

    6

    非常好用

    import time
    import collections
    
    class FPS:
        def __init__(self,avarageof=50):
            self.frametimestamps = collections.deque(maxlen=avarageof)
        def __call__(self):
            self.frametimestamps.append(time.time())
            if(len(self.frametimestamps) > 1):
                return len(self.frametimestamps)/(self.frametimestamps[-1]-self.frametimestamps[0])
            else:
                return 0.0
    fps = FPS()
    for i in range(100):
        time.sleep(0.1)
        print(fps())
    

    确保每帧只调用一次fps


    我建议使用datetime.now().timestamp(),它比time.time()更精确。 - iperov

    1
    你可能想要做一些类似这样的事情:

    def program():
      start_time = time.time() #record start time of program
      frame_counter = 0
    
      # random logic 
      for i in range(0, 100):
        for j in range(0, 100):
          # do stuff that renders a new frame
          frame_counter += 1 # count frame
    
      end_time = time.time() #record end time of program
      fps = frame_counter / float(end_time - start_time)
    

    当然,你不必等到程序结束才计算end_timefps,你可以每隔一段时间计算一次,以在程序运行时报告FPS。在报告当前FPS估计后重新初始化start_time也有助于报告更精确的FPS估计。

    0
    from time import sleep,time
    fps = 0
    fps_count = 0
    start_time = time()
    while True:
       if (time()-start_time) > 1:
         fps = fps_count
         fps_count = 1
         start_time = time()
      else:
         fps_count += 1 
      print("FPS:",fps)
    

    FPS = 每秒运行的周期数。


    0

    这是寻找FPS的示例代码。我已经用它进行了预处理、推理和后处理。希望这可以帮到你!

    import time
    
    ...
    
    dt, tt, num_im = [0.0, 0.0, 0.0], 0.0, 0
    
    for image in images:
        num_im += 1
    
        t1 = time.time()
        # task1....
        t2 = time.time()
        dt[0] += t2 - t1
    
        # task2...
        t3 = time.time()
        dt[1] += t3 - t2
    
        # task3...
        dt[2] += time.time() - t3
        tt += time.time() - t1
    
    t = tuple(x / num_im * 1E3 for x in dt)
    print(f'task1 {t[0]:.2f}ms, task2 {t[1]:.2f}ms, task3 {t[2]:.2f}ms, FPS {num_im / tt:.2f}')
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接