在pygame中加入多处理

时间:2018-01-04 15:17:52

标签: python multiprocessing

我尝试在python中使用pygame模块创建一个简单的游戏。它是一个双人游戏,所以它涉及在同一个游戏屏幕中获得同步输入或换句话说,事件。我尝试使用多线程,即通过运行两个共享pygame屏幕的线程,但由于GIL它没有工作。因此,当我尝试使用多处理时,我遇到了一个问题,即我无法共享相同的pygame屏幕。那么有没有办法创建一个具有pygame屏幕的池,就像序列一样?如果没有,是否还有其他可能更好的方法来解决我的问题?任何答案将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

您可能不需要多线程和更少的多处理。

你是什么意思"由于GIL"它没有用?尝试执行多线程时是否收到任何错误消息?

可能会创建一个天真的多线程设计,可以帮助更新由不同玩家控制的对象,但无论如何都必须要小心。 GIL应该只影响你,你真的没有任何好处,比如在你的应用程序中使用超过1个核心,但不会给你任何错误。

至于使用多处理,辅助过程无论如何都无法使用屏幕Surface,并且在整个过程中传递表面(图像)大多不值得(如果可行的话)。

  

我的意思是当我按下按钮时,只检测到其中一个线程   关键。我没有得到任何错误。这是由于GIL对吗?对不起   如果我错了

不 - 这与GIL没有任何关系 - 它与pygame事件API有关,而不是设计用于线程。

在Pygame中有两种处理按键的方法:检查KEYDOWN事件或调用pygame.key.get_pressed。我通常更喜欢第二种,因为它不依赖于操作系统或BIOS级别的键自动重复设置(当然,除非它是一个只执行一次的操作,而不是按下键时)。

无论如何,在任何与pygame相关的项目中,你应该在代码中的一个地方和同一个线程上检查pygame事件(包括按键)。一旦您从"外部世界"获得所需信息,您就可以根据需要设置内部变量。

但是,由于您不提供任何代码,我可以向您的多线程代码建议的最直接的解决方法是使用get_pressed而不是检查事件:它可能适用于两个线程。 (多处理代码会比这复杂得多)。