我尝试在python中使用pygame模块创建一个简单的游戏。它是一个双人游戏,所以它涉及在同一个游戏屏幕中获得同步输入或换句话说,事件。我尝试使用多线程,即通过运行两个共享pygame屏幕的线程,但由于GIL它没有工作。因此,当我尝试使用多处理时,我遇到了一个问题,即我无法共享相同的pygame屏幕。那么有没有办法创建一个具有pygame屏幕的池,就像序列一样?如果没有,是否还有其他可能更好的方法来解决我的问题?任何答案将不胜感激。谢谢。
答案 0 :(得分:1)
您可能不需要多线程和更少的多处理。
你是什么意思"由于GIL"它没有用?尝试执行多线程时是否收到任何错误消息?
可能会创建一个天真的多线程设计,可以帮助更新由不同玩家控制的对象,但无论如何都必须要小心。 GIL应该只影响你,你真的没有任何好处,比如在你的应用程序中使用超过1个核心,但不会给你任何错误。
至于使用多处理,辅助过程无论如何都无法使用屏幕Surface,并且在整个过程中传递表面(图像)大多不值得(如果可行的话)。
我的意思是当我按下按钮时,只检测到其中一个线程 关键。我没有得到任何错误。这是由于GIL对吗?对不起 如果我错了
不 - 这与GIL没有任何关系 - 它与pygame事件API有关,而不是设计用于线程。
在Pygame中有两种处理按键的方法:检查KEYDOWN
事件或调用pygame.key.get_pressed
。我通常更喜欢第二种,因为它不依赖于操作系统或BIOS级别的键自动重复设置(当然,除非它是一个只执行一次的操作,而不是按下键时)。
无论如何,在任何与pygame相关的项目中,你应该在代码中的一个地方和同一个线程上检查pygame事件(包括按键)。一旦您从"外部世界"获得所需信息,您就可以根据需要设置内部变量。
但是,由于您不提供任何代码,我可以向您的多线程代码建议的最直接的解决方法是使用get_pressed
而不是检查事件:它可能适用于两个线程。 (多处理代码会比这复杂得多)。