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

Re: [pygame] Slow rendering speed - sprites



Isnât Pyglet using OpenGL by default? Iâd like to see the next iteration of Pygame use hardware acceleration by default so that this type of issue goes away.

~ Michael

 

On Sun : Mar 8, 2015 2:14:39 AM you wrote:

> Much better, thanks.

>

> The only a bit serious impact on performance is the Surface.convert

> method on loaded image here. Good point.

>

> Sprite image is of 310x360 px dimensions and with alpha layer. With

> 200 sprites optimized with .convert_alpha I get about 19 fps, with

> plain .convert it raises upto 67 fps but transparency is lost which is

> unacceptable.

>

> In the meantime I've tested by the same example also another python

> game library called Pyglet, where at 200 sprites framerate of 40 per

> second was achieved (60 fps at 180 sprites). Good gain, however API

> esp. OpenGL primitives drawing feels a bit unwieldy to me.

>

>

> On Sun, Mar 8, 2015 at 1:06 AM, bw <stabbingfinger@xxxxxxxxx> wrote:

> > Hi,

> >

> > See the attached for some tweaks.

> >

> > I bumped the number of sprites up to 200.

> >

> > When I used my own 100x100-pixels png that has an alpha layer I get a bit

> > more than 100 fps. Alpha layers take extra CPU to render.

> >

> > When I use same-size filled rects of the same dimensions I get a little over

> > 200 fps.

> >

> > When you load your image, you might get better performance if you convert()

> > it or convert_alpha().

> >

> > Hope this helps.

> >

> > Gumm

> >

> >

> > On 3/7/2015 1:37 PM, David Unric wrote:

> >>

> >> Hello,

> >>

> >> I'm considering a game framework for next more serious project. As I'm

> >> Python/Ruby language agnostic, I did rewrote simple sprite benchmark

> >> from Gosu to latest Pygame to do a performance comparison. You may

> >> find the code bellow.

> >>

> >> I was very surprised Pygame version performs much more worse. To get

> >> an idea, it was tested on the same machine, in the same environment,

> >> linked against same SDL 1.2.15, run with Python 2.7.5. It starts

> >> significantly drop framerate when sprites count gets over 20, whereas

> >> Gosu version with Ruby 2.2.0 smoothly renders 200 sprites at 60 fps !

> >> At about 100 sprites on the screen it becomes just a very slow slideshow.

> >>

> >> I don't know if something important performance-wise was missed.

> >> Simple background is a static surface, display is also initialized

> >> with native resolution 1376x768 in fullscreen,

> >> LayeredDirty group with DirtySprites for better performance (Gosu

> >> version also handles z-order of each sprite).

> >>

> >> Any idea what am I doing wrong ?

> >>

> >>

> >> _______________________________________ snip

> >> ____________________________________________________

> >> import pygame, pygame.gfxdraw

> >> from pygame import *

> >> from random import randint

> >>

> >> def main():

> >> pygame.init()

> >>

> >> video_info = pygame.display.Info()

> >> if video_info.current_w != -1 and video_info.current_h != -1:

> >> screen_width, screen_height = video_info.current_w,

> >> video_info.current_h

> >> else:

> >> screen_width, screen_height = 800, 600

> >>

> >> screen = pygame.display.set_mode((screen_width, screen_height),

> >> FULLSCREEN | DOUBLEBUF | HWSURFACE)

> >> pygame.display.set_caption(__name__.upper())

> >>

> >> background = "">

> >> background.fill((0, 0, 0))

> >> pygame.gfxdraw.filled_trigon(background,

> >> screen_width/10, screen_height/10,

> >> screen_width*9/10, screen_height*9/10,

> >> screen_width/2, screen_height*9/10,

> >> (210, 200, 77))

> >> sprites = pygame.sprite.LayeredDirty()

> >> image = pygame.image.load('my_sprite.png')

> >> for _ in xrange(30): XSprite(image, sprites)

> >> del image

> >>

> >> # main game loop

> >> while True:

> >> for event in pygame.event.get():

> >> if event.type == QUIT: return

> >> elif event.type == KEYDOWN and event.key == K_ESCAPE: return

> >>

> >> screen.blit(background, (0, 0))

> >> sprites.update(screen)

> >> sprites.draw(screen)

> >> pygame.display.flip()

> >>

> >> class XSprite(pygame.sprite.DirtySprite):

> >> def __init__(self, image, *groups):

> >> super(XSprite, self).__init__(*groups)

> >> self.image = image

> >> self.rect = self.image.get_rect()

> >> self.rect.x = randint(0, 60)

> >> self.rect.y = randint(0, 40)

> >> self.dx, self.dy = randint(1, 16), randint(1, 16)

> >>

> >> def update(self, screen, *args):

> >> screen_w, screen_h = screen.get_size()

> >> self.rect.x += self.dx

> >> self.rect.y += self.dy

> >> if (self.rect.x + self.dx + self.rect.w > screen_w) or \

> >> (self.rect.x + self.dx < 0):

> >> self.dx = -self.dx

> >> if (self.rect.y + self.dy + self.rect.h > screen_h) or \

> >> (self.rect.y + self.dy < 0):

> >> self.dy = -self.dy

> >> self.rect.move_ip(self.dx, self.dy)

> >>

> >> if __name__ == '__main__':

> >> main()

> >>

> >> # vim: set ft=python ts=8 sts=4 sw=4 tw=79 fdm=indent:

> >> _______________________________________ snip

> >> ____________________________________________________

> >

> >