The dirty rects are done correctly. When you call most draw functions pygame returns a "dirty rect"--that is, a rect that squares off the area of the surface that has changed. If you call update() with rects or a rect as an argument it only updates those spots on the screen/surface and thus does not have to process the full screen. It's much faster.
> On Jul 29, 2015, at 01:37, Sam Bull <sam.hack...@sent.com> wrote: > >> 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...