簡體   English   中英

Python幫助Pygame和多處理

[英]Python Help with Pygame and Multiprocessing

我正在使用pygame將圖像blit到屏幕上,而它正在進行主循環。 我正在為線程使用多處理,但似乎存在問題。 請不要因為奇怪的想法xml評論而嘲笑我,因為我對此很新。

這是我的代碼。

#Import libraries
import pygame
import os, sys
import multiprocessing as threading
import time
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((1400,900), FULLSCREEN)
class loader:
    def sound(name):
        load = os.path.join("data", name)
        sound = pygame.mixer.Sound(load)
        return sound

    def song(name):
        load = os.path.join('data', name)
        song = pygame.mixer.Sound(load)
        return song

    def picture(name):
        load = os.path.join("data", name)
        image = pygame.image.load(load)
        image = image.convert()
        return image
    def movie(name):
        load = os.path.join("data", name + ".mpg")
        movie = pygame.movie.Movie(name)
        return movie











class data():
    class movies():
        #Turns out it's not supported D:
        pass
    class songs():
        theme = loader.song("theme.ogg")
    class sounds():
        fctune = loader.sound("fctune.wav")
    class pictures():
        fc = loader.picture("fc_opaque.tga")


#------------------------Logics-------------------------

def showlogo():
    screen.blit(data.pictures.fc, (0,0))
    data.sounds.fctune.play()
    time.sleep(30)



def startloops():
    logo = threading.Process(target=showlogo, args=())
    gameloop = threading.Process(target=mainloop, args=())
    logo.start()
    logo.join(None)
    gameloop.start()
    gameloop.join(None)

def mainloop():
    while 1:
        clock.tick(30)
        pygame.display.flip()
        for event in pygame.event.get():
            if event.type == QUIT:
                return
            elif event.type == KEYDOWN and event.key == K_ESCAPE:
                sys.exit(1)
            elif event.type == MOUSEBUTTONDOWN:
                pass
            elif event.type is MOUSEBUTTONUP:
                pass
            #End of looper.


#-----------------------/Logics-------------------------



#----------------------Globals--------------------------

clock = pygame.time.Clock() 
#----------------------/Globals-------------------------


if __name__ == "__main__": startloops()

它的作用是創建2個pygame窗口..(一個應該在你打電話時出現

screen = pygame.display.set_mode((1400,900), FULLSCREEN)

所以顯然它正在召喚兩次。 嗯,多處理似乎是罪魁禍首。 任何人都可以幫忙嗎?

這就是我認為正在發生的事情。 基本上, multiprocessing模塊的工作原理是將target所需的所有內容的副本發送給全新的解釋器; 這就是它如何繞過GIL 但這意味着副作用(對全局變量的更改,對傳入但未返回的對象的更改)不會按預期傳播。 這是一個簡單的例子:

>>> import multiprocessing
>>> d = {'a':5, 'b':6}
>>> def alter_d():
...     d['a'] = 7
...     print d
... 
>>> p = multiprocessing(target=alter_d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable
>>> p = multiprocessing.Process(target=alter_d)
>>> p.start()
>>> {'a': 7, 'b': 6}

>>> d
{'a': 5, 'b': 6}

正如您所看到的,已經更改了傳遞給新進程的d版本。 但是本地版本的d仍然是相同的。

現在我對pygame的內部結構一無所知。 但我的猜測是,當你使用logo = threading.Process(target=showlogo, args=())創建一個新進程時,它會復制一個screen 然后,無論是在進行復制時,還是在新進程內調用screen.blit(data.pictures.fc, (0,0)) ,都會生成一個全新的屏幕。

幸運的是,你現在使用多處理的方式完全沒有意義。 join只是暫停主進程並等待子進程完成 - 沒有任何並發​​性。 此外,我敢打賭,pygame提供了你實際需要的任何線程功能 - 我懷疑你需要多處理。 我建議你拋棄它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM