【问题标题】:Pygame simple loop runs very slowly on MacPygame 简单循环在 Mac 上运行非常缓慢
【发布时间】:2015-04-23 21:04:54
【问题描述】:

E: 在 OS X 和 Linux 上进行相同测试后,我可以确认以下情况仅在 OS X 上发生。在 Linux 上,它实际上以 1000 fps 运行,我碰巧想知道。有什么解释吗?感谢 TextMate,我更喜欢在 Mac 上开发。


这是一个简单的循环,它几乎什么都不做,并且仍然运行得很慢。谁能解释为什么? FPS 的平均值略高于 30,每次通过循环需要 30 毫秒多一点。窗口大小似乎根本不会影响这一点,因为即使设置像 (50,50) 这样的小窗口大小也具有相同的 fps。

我觉得这很奇怪,我希望任何现代硬件都可以为这样一个简单的循环实现 1000 fps,即使我们每次都更新每个像素。从配置文件中我可以看到 {built-in method get}{built-in method update} 加起来每次调用似乎需要大约 30 毫秒的时间,这真的是我们可以在不使用脏矩形的情况下得到的最好结果吗?

pygame.init()
clock = pygame.time.Clock()
fps = 1000
#milliseconds from last frame
new_time, old_time = None, None    

done = False

while not done:

    clock.tick(fps)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    # show fps and milliseconds
    if new_time:
        old_time = new_time
    new_time = pygame.time.get_ticks()
    if new_time and old_time:
        pygame.display.set_caption("fps: " + str(int(clock.get_fps())) + " ms: " + str(new_time-old_time))

    pygame.display.update()

这是 main 函数的 cProfile 的开头。

         94503 function calls (92211 primitive calls) in 21.011 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.026    0.026   21.011   21.011 new_main.py:34(main)
      652   14.048    0.022   14.048    0.022 {built-in method get}
      652    5.864    0.009    5.864    0.009 {built-in method update}
        1    0.444    0.444    0.634    0.634 {built-in method init}
      651    0.278    0.000    0.278    0.000 {built-in method set_caption}
     72/1    0.000    0.000    0.151    0.151 <frozen importlib._bootstrap>:2234(_find_and_load)
     72/1    0.000    0.000    0.151    0.151 <frozen importlib._bootstrap>:2207(_find_and_load_unlocked)
     71/1    0.000    0.000    0.151    0.151 <frozen importlib._bootstrap>:1186(_load_unlocked)
     46/1    0.000    0.000    0.151    0.151 <frozen importlib._bootstrap>:1122(_exec)
     46/1    0.000    0.000    0.151    0.151 <frozen importlib._bootstrap>:1465(exec_module)
     74/1    0.000    0.000    0.151    0.151 <frozen importlib._bootstrap>:313(_call_with_frames_removed)
     54/1    0.004    0.000    0.151    0.151 {built-in method exec}
        1    0.000    0.000    0.151    0.151 macosx.py:1(<module>)
        1    0.000    0.000    0.150    0.150 pkgdata.py:18(<module>)
     25/3    0.000    0.000    0.122    0.041 <frozen importlib._bootstrap>:1156(_load_backward_compatible)
      8/1    0.026    0.003    0.121    0.121 {method 'load_module' of 'zipimport.zipimporter' objects}
        1    0.000    0.000    0.101    0.101 __init__.py:15(<module>)
        1    0.000    0.000    0.079    0.079 config_reader.py:115(build_from_config)
        2    0.000    0.000    0.056    0.028 common.py:43(reset_screen)
        2    0.055    0.027    0.055    0.027 {built-in method set_mode}
    72/71    0.001    0.000    0.045    0.001 <frozen importlib._bootstrap>:2147(_find_spec)
    70/69    0.000    0.000    0.043    0.001 <frozen importlib._bootstrap>:1934(find_spec)
    70/69    0.001    0.000    0.043    0.001 <frozen importlib._bootstrap>:1902(_get_spec)
       92    0.041    0.000    0.041    0.000 {built-in method load_extended}
        6    0.000    0.000    0.041    0.007 new_map.py:74(add_character)
        6    0.000    0.000    0.041    0.007 new_character.py:32(added_to_map)
        6    0.001    0.000    0.041    0.007 new_character.py:265(__init__)
        1    0.000    0.000    0.038    0.038 macosx.py:14(Video_AutoInit)
        1    0.038    0.038    0.038    0.038 {built-in method InstallNSApplication}
        1    0.036    0.036    0.036    0.036 {built-in method quit}
       65    0.001    0.000    0.036    0.001 re.py:277(_compile)
       49    0.000    0.000    0.036    0.001 re.py:221(compile)

【问题讨论】:

  • 即使没有更新调用,我的 mac 也只能达到 60 fps。
  • set_caption 更改为类似的打印:print ("fps: " + str(int(clock.get_fps())) + " ms: " + str(new_time-old_time)) 也让我达到 60 fps。
  • 另外,为什么 60 fps 不够快?您的显示器可能无法以比这更快的速度显示。
  • 只是为了好玩,我在使用 Fusion 的 Windows 7 VM 中进行了尝试,它被限制为 62 fps。我没有带有 pygame 的 linux 机器来进行实验,但我猜它只是在以某种方式对你撒谎。
  • 一些 fps 足够不是重点。关键是,如果它仅以 60fps 运行,似乎有问题。在我看来,它应该以更高的 fps 运行。

标签: python-3.x pygame


【解决方案1】:

这个问题的答案最终是 OS X 下的视网膜显示是差异化因素。即使在同一台 Mac 上的外部显示器上运行它也可以正常工作。但是将窗口移动到视网膜显示器会使其变得迟缓。连接或不连接外接显示器。

另一方面,它在 Linux 下的同一个视网膜显示器上运行得很好。目前尚不清楚显示管理器/渲染中的差异是什么导致了这种情况,但我怀疑有什么可以做的。

【讨论】:

  • 我们遇到了完全相同的问题。你有没有找到解决这个问题的解决方案,让游戏在 macbook 屏幕上也能流畅运行?
  • @Merijndk 据我所知,不幸的是,情况发生了变化。也不知道为什么会这样。
  • 这有点道理,因为 ratina 的屏幕尺寸很大。问题是python在mac上整体速度很慢。我在 linux 和 windows 上轻松地以 250fps 运行我们的应用程序,我的朋友们相当新的 macbook 以最高 60fps 的速度运行它。 python也将使用100%的cpu,而在我的windows上它只有10%。希望他们尽快修复它
【解决方案2】:

将游戏分辨率更改为全屏对我有帮助。 试试这个:

window = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)

代替:

window = pygame.display.set_mode((winx, winy))

【讨论】:

    猜你喜欢
    • 2018-11-11
    • 2017-05-12
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2020-07-22
    • 1970-01-01
    相关资源
    最近更新 更多