Сложность комбинирования пигмеев с витыми заключается в том, кто контролирует основной цикл. Обычно это приводит к желанию объединить основной вид интерфейса UI (GTK, Tkinter и т. Д.) С Twisted, и PyGame ничем не отличается.
Что я хотел бы предложить, так это то, что поскольку задержка в сети важна и поскольку у twisted очень хорошая структура планирования, то вы позволяете витому реактору работать и контролировать основной цикл, а затем используете LoopingCall, чтобы позволить вам обрабатывать события из Pygame.
На самом базовом:
from twisted.internet.task import LoopingCall
DESIRED_FPS = 30.0 # 30 frames per second
def game_tick():
events = pygame.events.get()
for event in events:
# Process input events
redraw()
# Set up a looping call every 1/30th of a second to run your game tick
tick = LoopingCall(game_tick)
tick.start(1.0 / DESIRED_FPS)
# Set up anything else twisted here, like listening sockets
reactor.run() # Omit this if this is a tap/tac file
Поначалу это кажется простым, но сопряжено с опасностями. Если вы тратите много времени на обработку игрового тика, то вы рискуете заморозить закрученный реактор, что сделает его неспособным обрабатывать события. Если вам нужны синхронизированные события, не блокируйте, а используйте витые инструменты, такие как reactor.callLater
. Чем больше вы сможете избежать блокировок, тем более отзывчивым будет ваше приложение. Это слишком много вещей, чтобы описать их в нескольких параграфах, поскольку программирование для витой - это образ мышления, к которому действительно нужно привыкнуть, если вы никогда не занимались программированием для асинхронных или неблокирующих библиотек.
Для более полного примера, посмотрите " gam3 " для библиотеки игр для взаимодействия с витой (включая мировые часы для событий симуляции) и пример игры, сделанной одним из витых разработчиков, чтобы показать Как интегрировать Twisted и Pygame.