Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pygame.display.update()在线程上工作不正常_Python - Fatal编程技术网

Python pygame.display.update()在线程上工作不正常

Python pygame.display.update()在线程上工作不正常,python,Python,我正在用pygame为我的学校项目制作一个游戏。我想使用另一个线程(不包括主线程)运行pygame.display.update()来更新我的游戏屏幕 代码如下: def display_update(): 在运行时:#运行之前对于游戏循环声明为True pygame.display.update() dis=线程(目标=显示\更新) dis.start() 但是,代码运行后,屏幕上的图像会闪烁。您不应该使用这样的线程,因为pygame可以在主线程中轻松更新,并且使用pygame线程可能会导致

我正在用pygame为我的学校项目制作一个游戏。我想使用另一个线程(不包括主线程)运行
pygame.display.update()
来更新我的游戏屏幕

代码如下:

def display_update():
在运行时:#运行之前对于游戏循环声明为True
pygame.display.update()
dis=线程(目标=显示\更新)
dis.start()
但是,代码运行后,屏幕上的图像会闪烁。

您不应该使用这样的线程,因为pygame可以在主线程中轻松更新,并且使用pygame线程可能会导致未定义的行为。

问题是线程没有同步。如果绝对有必要使用线程,那么类似的方法应该可以工作:

running = True
do_update = False


def display_update():
    while running: # running is declared before as True for the game loop 
       if do_update:
           pygame.display.update()
           do_update = False

dis  = Thread(target=display_update)
dis.start() 

while running:
    if not do_update:
        #Code
        #Code
        #Code
    do_update = True
这基本上会在
display\u update
更新屏幕时停止主线程

编写此代码的更好方法是:

while running:
    #Code
    #Code
    #Code
    pygame.display.update()

不要使用线程。Pygame是基于SDL2构建的,并且对可以在主线程以外的其他线程上运行的内容有限制。例如,事件的轮询只能在主线程中完成。更新显示应该在创建显示的线程中进行。有很多事情要考虑,虽然它看起来像是可行的,但有一个风险,你最终会遇到怪异而难以找到的错误。 Pygame将在必要时创建线程(例如,对于混合器)。你的例子肯定会给你带来问题
pygame.display.update()
每帧只能调用一次,不能在单独的线程中以尽可能快的速度调用。你的游戏会比单线程慢很多,有更多的bug,不确定性,使用更多的内存,等等。。。在您的示例中使用线程没有任何好处,只有缺点

按顺序执行,因为这样会更快,占用更少的内存,更容易调试,更容易推理,而且最重要的是,它不会出现任何意外行为

running = True
while running:
    # Handle timing

    # Handle events    

    # Update objects

    # Draw/blit to screen.

    pygame.display.update()  # Called only once per frame.
免责声明
在某些情况下,线程是有用的,例如执行异步I/O任务(如加载资产、获取/发送网络数据包)或并行计算。但是,你必须考虑并支付所有伴随它发生的并发症,比如在非同步和非确定性执行中同步共享数据和设计。

为什么你想要另一个线程,它可能会使代码变得过于复杂,而且似乎没有任何好处。不要使用线程。Pygame将在必要时创建线程(例如,对于混合器)。你很可能会遇到麻烦,因为pygame对某些线程的运行有限制。而且,你的例子肯定会给你带来问题
pygame.display.update()
每帧只能调用一次,不能在单独的线程中以尽可能快的速度调用。你的游戏会比单线程慢很多,有更多的bug,不确定性,使用更多的内存,等等。。。在你的例子中使用线程没有好处,只是缺点。谢谢兄弟worked@SabyasachiMitra除非您了解多线程的限制和复杂性,否则不要使用多线程,尤其是pygame。Pygame是基于SDL2构建的,并且对可以在主线程以外的其他线程上运行的内容有限制。例如,事件的轮询只能在主线程中完成。更新显示应该在创建显示的线程中进行。有很多事情要考虑,虽然它看起来像是可行的,但你最终会遇到奇怪的,很难找到的错误。@ SabyasaimimrrayA什,这个代码还有其他问题。code>display\u update正在消耗CPU,只需检查
do\u update
是否变为
True
。变量
do_update
也存在数据竞争,在本例中可能不会导致任何重大问题,但是这肯定是一个问题。@TedKleinBergman是的,我在问题评论中提到了这一点,我也会在我的回答中提到,我认为op必须使用线程,因为他的任务虽然,问题不是“pygame可以在主线程中轻松更新”。问题是pygame不能在其他线程中处理某些事情,这样做是未定义的行为。事件必须在主线程中处理,图形应该在初始化视频模块的线程上完成。因此,不仅存在复杂性、内存消耗、糟糕的CPU利用率、数据竞争等缺点,pygame(以及底层SDL2和OS)也不能保证程序是正确的。它可能是偶然发生的,但随时可能破裂