【发布时间】:2011-12-05 06:45:01
【问题描述】:
After yesterdays 选错问题我再试一次。
我有一个tic tac toe program,纯粹是为了学习网络游戏。
我对 twisted 的理解是我应该让一个服务器类运行反应器,然后让每个玩家作为客户端连接到它(服务器是一个单独的实体)。鉴于我最后一个问题中的 cmets,我怀疑我的处理方式完全错误。
我应该做什么以及我应该关注哪些教程或文档?
【问题讨论】:
After yesterdays 选错问题我再试一次。
我有一个tic tac toe program,纯粹是为了学习网络游戏。
我对 twisted 的理解是我应该让一个服务器类运行反应器,然后让每个玩家作为客户端连接到它(服务器是一个单独的实体)。鉴于我最后一个问题中的 cmets,我怀疑我的处理方式完全错误。
我应该做什么以及我应该关注哪些教程或文档?
【问题讨论】:
pygame 和twisted 结合的难点在于谁来控制主循环。这通常是想将任何类型的 UI(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
虽然这看起来很简单,但它也带来了危险。如果您在游戏中花费大量时间进行处理,那么您就有可能使扭曲的反应器挨饿,使其无法处理事件。如果您需要定时事件,请不要阻止,而是使用像reactor.callLater 这样的扭曲工具。您越能避免阻塞,您的应用程序的响应速度就会越快。这在几段中描述的内容太多了,因为如果您从未为异步或非阻塞库进行过编程,那么为 twisted 编程是一种真正需要一些时间来适应的思维方式。
如需更完整的示例,请查看“gam3”以获取与 twisted 交互的游戏库(包括用于模拟事件的世界时钟)以及由其中一位开发者制作的示例游戏,以展示如何集成 twisted和 pygame。
【讨论】: