Win32事件循环似乎是程序的瓶颈

时间:2011-04-17 20:54:01

标签: python profiling pywin32 pyglet

我正在使用Pyglet在Python中制作游戏。我刚刚完成了显示部分,并且速度问题。就像一个好人一样,我描述了并得到了以下内容:(不感兴趣的位被排除在外;目前它只是在我用随机品红色和白色按箭头键时重绘屏幕)

    15085326 function calls (15085306 primitive calls) in 32.166 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000   32.168   32.168 <string>:1(<module>)

   120139    0.499    0.000    0.686    0.000 allocation.py:132(alloc)
   120121    0.563    0.000    0.844    0.000 allocation.py:268(dealloc)

       99    0.743    0.008   20.531    0.207 engine.py:58(Update)

   237600    0.796    0.000   11.995    0.000 sprite.py:349(_set_texture)
   120121    0.677    0.000    9.062    0.000 sprite.py:365(_create_vertex_list)
   357721    1.487    0.000    3.478    0.000 sprite.py:377(_update_position)

   420767    0.786    0.000    2.054    0.000 vertexbuffer.py:421(get_region)
   715442    0.859    0.000    1.280    0.000 vertexbuffer.py:467(invalidate)


        1    9.674    9.674   32.168   32.168 win32.py:46(run)
      180    0.007    0.000    1.771    0.010 win32.py:83(_timer_func)


   237600    0.416    0.000   17.069    0.000 window.py:60(SetTile)
   237600    0.646    0.000    2.174    0.000 window.py:72(GetTileTexture)

所有内容&lt;总时间已经删除了0.5秒,差不多。大多数东西都不是问题。

这是我敲击键盘半分钟的结果。在大多数情况下,我每秒可以获得2或3次屏幕更改。我个人喜欢尽可能快地敲击键盘。哎呀,我的目标是50-60fps。

在子功能中花费10秒的win32运行令我担心。它可能是空闲时间(即使有一个pyglet空闲),但不会花费绘图吗?

我认为那部分很慢的部分实际上很快;窗口SetTile部分。为了处理瓷砖,我有一个2D精灵列表,它们在屏幕上代表它们并简单地改变图像。 我不认为这是一个问题。

我看到的另一个潜在问题是我的更新 - 每次调用时我都必须遍历~2400个磁贴。但是,它似乎并不那么糟糕。 90个按键只需0.7秒。

我开始怀疑这是否表明Python对我的需求来说太慢了。然后,它不应该是。我正在做的事情并不算太重。

tl; dr Python中的win32事件循环是我的瓶颈,这是什么意思?如果没有,我可能在哪里失去速度?

如果需要,可以使用代码。我假设它是pyglet使用的Pywin32。

1 个答案:

答案 0 :(得分:1)

修订答案: 我删除了无关信息的列,例如自我时间,通话计数和每次通话时间。 然后我按照时间顺序按顺序排列它们,然后丢弃那些小的。

cumtime  filename:lineno(function)
 32.168  <string>:1(<module>)
 32.168  win32.py:46(run)
 20.531  engine.py:58(Update)
 17.069  window.py:60(SetTile)
 11.995  sprite.py:349(_set_texture)
  9.062  sprite.py:365(_create_vertex_list)

Cumtime表示特定例程在调用堆栈上的总时间。 因此,自然会有一些高级例程在堆栈中持续32秒。 其他人在筹码上的时间较短。 例如,_set_texture约有1/3的时间处于活动状态,而_create_vertex_list在约1/3的时间内也处于活动状态。 这表明顶点正在被创建很多,而不是被重复使用,所以也许你可以通过不重新创建来节省大约30%的时间。

但这只是猜测。没有必要猜测。

你需要知道的是时间陈述的一小部分(不仅仅是功能) in 您的代码在堆栈中处于活动状态。 您需要知道,因为如果存在性能问题, 这是一行代码。

Here's how the problem can be found if you have one.

分析器似乎基于 gprof here are some comments about that