Справка Python по Pygame и многопроцессорности - PullRequest
3 голосов
/ 19 июня 2011

Я использую pygame, чтобы перетаскивать изображение на экран, в то время как это делает основной цикл. Я использую многопроцессорность для потоков, но, похоже, проблема. Пожалуйста, не разжевывайте меня из-за странных комментариев 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)

Так, очевидно, он звонит так дважды. Хм, многопроцессорность кажется виновником. Кто-нибудь может помочь?

1 Ответ

2 голосов
/ 19 июня 2011

Вот то, что я считаю, происходит.По сути, модуль 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 предоставляет все функции потоков, которые вам действительно нужны - я сомневаюсь, что вам вообще нужна многопроцессорная обработка.Я бы предложил, чтобы вы бросили это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...