[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] Problem loading 48 sounds?



On Wed, 2015-07-29 at 04:36 +0200, gilga gilga wrote:
> For a music program, at 30FPS, you can detect the delay between the
> typing and the playing of the sound...

A couple of points that might give you a performance boost. First, and
this could seriously be slowing down your program:

        https://github.com/gustavklopp/pypiano/blob/master/python_keyboardpiano.py#L66

This update() appears to be loading images from disk once for every key
on every frame, this would be really slow on a HDD and still not great
on a SSD (not to mention time spent garbage collecting all the old
copies getting freed every frame).

Try loading these images at the beginning:

        class Key(pygame.sprite.Sprite):
            def __init__(self, name, keyevent):
                self._img_down = pygame.image.load(os.path.join('pictures',self.name+'_pressed.png'))
                self._img_up = pygame.image.load(os.path.join('pictures',self.name+'_unpressed.png'))
                
            def update(self):
                if self.pressed:
                    self.image = self._img_down
                else:
                    self.image = self._img_up

The second point is that you appear to be trying to make use of dirty
rects, but you are not using dirty sprites. I'm not too familiar with
dirty sprites, but I think without them, that update call is not
optimising anything.

Perhaps try using a DirtySprite, something like:

        class Key(pygame.sprite.DirtySprite):
            def __init__(self, name, keyevent):
                self._img_down = pygame.image.load(os.path.join('pictures',self.name+'_pressed.png'))
                self._img_up = pygame.image.load(os.path.join('pictures',self.name+'_unpressed.png'))
                        
            def pressed(self, pressed):
                if pressed:
                    self.image = self._img_down
                else:
                    self.image = self._img_up
                self.dirty = 1
        
        
        ...
        
            for keyobj in Key.keyobj_list:
                if keyobj.keyevent == key:
                    keyobj.pressed(True)

This code also removes the need for the update method to be called every
frame. As the key is only updated on a key press event, it can be
updated on that event, thus the 'keysprite.update()' part can be skipped
completely. (Also, if you do want to update the sprites, you should be
able to just call 'self.keysprites.update()').


Try out those 2 changes and see what improvements you get.

> Maybe if you try it on your computer, the FPS are better and it's a
> problem with my OpenGL and Radeon Driver (known to be quite touchy)?

You're not using OpenGL...

Attachment: signature.asc
Description: This is a digitally signed message part