Pygame 简单循环在 Mac 上运行速度非常慢 [英] Pygame simple loop runs very slowly on Mac

查看:91
本文介绍了Pygame 简单循环在 Mac 上运行速度非常慢的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

E: 在 OS X 和 Linux 上进行了相同的测试后,我可以确认以下情况只发生在 OS X 上.在 Linux 上,它确实以 1000 fps 的速度运行,正如我碰巧想知道的那样.有什么解释吗?感谢 TextMate,我更喜欢在 Mac 上开发.

E: After testing the same on OS X and Linux, I can confirm that the following only happens on OS X. On Linux it literally runs at a thousand fps, as I happened to wonder. Any explanation? I would much prefer developing on Mac, thanks to TextMate.

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


Here's a simple loop that does almost nothing, and still runs very slowly. Can anyone explain why? FPS averages at little over 30, it takes a little over 30ms for each pass over the loop. Window size does not seem to affect this at all, as even setting a tiny window size like (50,50) has the same fps.

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

I find this weird, I would expect that any contemporary hardware could do a thousand fps for such a simple loop, even when we update every pixel every time. From the profile I can see that {built-in method get} and {built-in method update} combined seem to take around 30ms of time per call, is that really the best we can get out without using dirty rects?

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 的开头.

Here's the beginning of a cProfile of the main function.

         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)

推荐答案

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

The answer to this ended up being that the retina display under OS X is the differentiating factor. Running it even on an external display on the same Mac works fine. But moving the window to the retina display makes it sluggish. With or without an external monitor connected.

另一方面,它在 Linux 下的同一视网膜显示器上运行得很好.目前尚不清楚导致这种情况的显示管理器/渲染的差异是什么,但我怀疑人们对此有什么办法.

On the other hand, it runs just fine on the same retina display under Linux. It is unclear what the difference in the display managers / rendering is that causes this, but I doubt there is anything one could do about it.

这篇关于Pygame 简单循环在 Mac 上运行速度非常慢的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆