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

[pygame] Re: Sprite Surface very slow to draw



Hi,

Thanks for your answer, I wasn't looking yet for speed & optimization,
but hey your advice will soon be used :) :)
I'm re-creating the game Einstein : http://games.flowix.com/en/index.html
which is full open source, and *very* nice.

I just needed to learn python and to do a full game 100 % Windows /
Linux compatible.

pyGame seems one of the best way to go.

And python is amazing how your develop quick (compared to Php and all
other languages).

Regards,

Olivier Pons

On 20 juil, 10:59, stas zytkiewicz <stas.zytkiew...@xxxxxxxxx> wrote:
> On Tue, Jul 20, 2010 at 10:39 AM, SurferIX <olivier.p...@xxxxxxxxx> wrote:
> > If found the solution!
> > The problem is that the documentation needs examples (or maybe I
> > didn't find good ones):
>
> You should look at the pygame reference doc:http://www.pygame.org/docs/ref/index.html
>
> > I was using:
> >  40         self.image.convert_alpha()
> > I should have done:
> >  40         self.image.convert_alpha(self.image)
> > (which I don't understand btw)
>
> See the docs:
> """"
> Surface.convert_alpha
>
>       change the pixel format of an image including per pixel alphas
>       Surface.convert_alpha(Surface): return Surface
>       Surface.convert_alpha(): return Surface
>
>       Creates a new copy of the surface with the desired pixel format.
> The new surface will be in a format suited for quick blitting to the
> given format with per pixel alpha. If no surface is given, the new
> surface will be optimized for blitting to the current display.
> """"
>
> I guess it's quicker to convert the existing surface than to create a new one.
> But it's thing that's slows your code down.
> The problem is in you event loop:
>
> 71     going = True
>  72     while going:
>  73         clock.tick(60)
> First ask your self if you need a framerate of 60 per second.
> Most of the time 30 p/s is enough, that alone will cut the stuff todo in half.
> Now you do alll the below stuff 60 times per second
>
>  74         for event in pygame.event.get():
>  75             if event.type == QUIT:
>  76                 going = False
>  77             elif event.type == KEYDOWN:
>  78                 if event.key == K_ESCAPE:
>  79                     going = False
>  80                 elif event.key == K_q:
>  81                     going = False
>  82                 elif event.key == K_RETURN:
>  83                     going = False
>  This doesn't take much time.
> But the stuff below does.
>
>  85         group_sprites.update()
>  86         screen.blit(background, (0, 0))
> You blit the complete screen 60 times per second !
>
> The rest depends on how many sprites you have in your class.
>  87         group_sprites.draw(screen)
>  88         for sprite in group_sprites:
>  89             if isinstance(sprite, Contour):
>  90                 if sprite.done:
>  91                     group_sprites.remove(sprite)
>  92         pygame.display.flip()
>
> Most of the times you have speed troubles the problem lies in to many
> things in the mainloop.
> You should for example only blit the rect on the screen that needs
> erasing, not the complete screen.
>
> From the docs:
> """"
>  Surface.blit
>
>       draw one image onto another
>       Surface.blit(source, dest, area=None, special_flags = 0): return Rect
>        ....
>       An optional area rectangle can be passed as well. This
> represents a smaller portion of the source Surface
>       to  draw.
>       .....
> """"
> If you do:
> dirty = [ ]
> ....
> rect = sprite_to_erase.get_rect()
> dirty.append(screen.blit(background, rect, rect))
> ....
> Than instead of pygame.display.flip use:
> pygame.display.update(dirty)
>
> Taken from the docs:
> """"
> pygame.display.update
>
>       update portions of the screen for software displays
>       pygame.display.update(rectangle=None): return None
>       pygame.display.update(rectangle_list): return None
>
>       This function is like an optimized version of
> pygame.display.flip - update the full display Surface to the
>        screen
>       for software displays. It allows only a portion of the screen to
> updated, instead of the entire area.
> """"
> Your loop will be way faster.
>
> Greetings,
> Stas
>
> --
> Free-source educational programs for schoolshttp://www.schoolsplay.org andhttp://wiki.laptop.org/go/Schoolsplayhttp://gvr.sf.netandhttp://wiki.laptop.org/go/Guido_van_Robot