Цикл событий Win32 оказывается узким местом программы - PullRequest
1 голос
/ 18 апреля 2011

Я делаю игру на Python с Pyglet.Я только что закончил часть показа, и получаю проблемы со скоростьюКак хороший человек, я профилировал и получил следующее: (неинтересные биты исключены; в настоящее время он просто перерисовывает экран, когда я нажимаю клавишу со стрелкой со случайным пурпурным и белым)

    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)

Все, что заняло <0,5секунд за общее время было удалено, в значительной степени.В основном вещи, которые не могут быть проблемой. </p>

Это результат того, что я нажимаю на клавиатуру полминуты.По большей части, я мог получить 2 или 3 смены экрана в секунду. Мне лично хотелось бы так быстро, как я мог нажимать на клавиатуру.Черт, моя цель - хорошие 50-60 кадров в секунду.

Запуск win32 - 10 секунд без подфункций - вот что меня беспокоит.Это может быть простой (хотя есть пиглетный холостой ход), но разве это не будет потрачено на рисование?

Часть, которую я считал медленной, на самом деле была быстрой;Окно SetTile часть.Чтобы разобраться с плитками, у меня есть двухмерный список спрайтов, которые представляют их на экране и просто меняют изображения.Я не думаю, что это проблема.

Другая потенциальная проблема, с которой я столкнулся, это мое Обновление - мне приходится перебирать ~ 2400 плиток каждый раз, когда он вызывается.Тем не менее, это не так уж плохо.Только 0,7 секунды для 90 нажатий клавиш.

Я начинаю задумываться, не является ли это признаком того, что Python слишком медленный для моих нужд.Опять же, это не должно быть.Это не слишком сложная вычислительная вещь, которую я делаю.

tl; dr Является ли цикл событий win32 в Python моим узким местом, и что это значит?Если нет, то где я могу потерять скорость?

Код доступен при необходимости.Я предполагаю, что это Pywin32, используемый pyglet.

1 Ответ

1 голос
/ 18 апреля 2011

ПЕРЕСМОТРЕННЫЙ Ответ: Я удалил столбцы, которые не содержат никакой бесполезной информации, такой как время в пути, количество вызовов и время для каждого вызова.Затем я расположил их в порядке убывания по времени cumtime и отбросил маленькие.

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% времени, не создавая их заново.

Но это всего лишь предположение.Не нужно догадываться.

Что вам нужно знать, это доля операторов времени (не только функций) в ваш код были активны в стеке.Вы должны знать это, потому что, если есть проблема с производительностью, это такая строка кода.

Вот как можно найти проблему, если она у вас есть.

Кажется, что профилировщик основан на gprof , и вот некоторые комментарии о , что .

...