我试图创建一个pygame程序与2d可绘制的网格和方法运行很长一段时间。我希望主游戏循环能够在方法运行时进行处理,所以我选择了threading
模块,它工作得很好,但我发现multiprocessing
模块更适合cpu繁重的程序,所以我想切换。下面的代码是我的实际代码的一个示例或代表
# importing the necessary libraries
class Board:
# class representing the actual 2d grid or board on screen
class Graph:
# class for drawing methods that take a long time to run
# Graph's methods call q.get() to get the Board object then
# make appropriate changes to it then call q.put() to put it back in the Queue
def draw_board(surface, rects):
# surface: pygame.display
# rects: list of pygame rectangle objects
# draw every rectangle in rects to the display surface.
def main():
# main game loop
board = Board(*args)
q = multiprocessing.Queue()
q.put(board)
graph = Graph(q)
while True:
draw_board(*args)
for event in pygame.event.get():
# checking some conditions and keypresses here
elif event.type == KEYDOWN:
if event.key == pygame.K_r:
t = multiprocessing.Process(target=graph.draw_sth)
t.start()
pygame.display.update()
# fps clock ticks for 60 FPS here
if __name__ == "__main__":
main()
我使用multiprocessing.Queue
将资源从主进程转移到main()
内部生成的进程并返回。当我运行此命令并单击" "键时,什么也没有发生,并且终端在第一次调用main
时打印介绍行,即
pygame 2.0.1 (SDL 2.0.14, Python 3.9.5)
Hello from the pygame community. https://www.pygame.org/contribute.html
当我使用线程时不会发生这种情况,所以我认为这是由于我使用Queue
或者我可能误解和滥用了multiprocessing
。在这件事上任何帮助都是感激的。为简单起见,省略了一些代码行。
尝试在事件循环之前调用此函数。(我不知道这是否适用于多处理)
def continue_pygame_loop():
pygame.mainloop(0.1)
yield
这个帖子可以更好地解释它背后的机制:pyGame在一个线程