Я делаю игру на 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.