【问题标题】:Combining pygame and twisted结合pygame和twisted
【发布时间】:2011-12-05 06:45:01
【问题描述】:

After yesterdays 选错问题我再试一次。

我有一个tic tac toe program,纯粹是为了学习网络游戏。

我对 twisted 的理解是我应该让一个服务器类运行反应器,然后让每个玩家作为客户端连接到它(服务器是一个单独的实体)。鉴于我最后一个问题中的 cmets,我怀疑我的处理方式完全错误。

我应该做什么以及我应该关注哪些教程或文档?

【问题讨论】:

    标签: python twisted pygame


    【解决方案1】:

    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。

    【讨论】:

    • 这个真的很有用,下班回家就试一试。
    • +1 +1。绝对不希望 pygame 在线程中运行,正如我最近发现的那样......
    猜你喜欢
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    相关资源
    最近更新 更多