结合pygame和twisted
1 个回答
12
把pygame和twisted结合起来的难点在于谁来控制主循环。这个问题通常出现在想把任何类型的用户界面(比如GTK、Tkinter等)的主循环和Twisted结合时,pygame也是一样的。
我建议,由于网络延迟很重要,而twisted有一个很好的调度框架,所以你可以让twisted的反应器(reactor)来运行并控制主循环,然后使用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
虽然这看起来很简单,但其实有风险。如果你在游戏的每一帧中花费太多时间进行处理,就可能会让twisted的反应器“饿死”,导致它无法处理事件。如果你需要定时事件,就不要阻塞,而是使用twisted提供的工具,比如reactor.callLater
。你越能避免阻塞,应用程序的响应速度就会越快。要在几段文字中描述这些内容实在太多了,因为如果你从未接触过异步或非阻塞库的编程,使用twisted的编程思维确实需要一些时间来适应。
如果想要更完整的例子,可以查看“gam3”,这是一个与twisted接口的游戏库(包括用于模拟事件的世界时钟),还有一个由twisted开发者制作的示例游戏,展示了如何将twisted和pygame结合起来。