2012-08-22 32 views
0

我有一个简单的自上而下的垂直射手la Galaga,我正在搞乱。然而,在查看完文档之后,我对如何有效地加载图像以及是否每帧都会对它们进行blit有点困惑。所有的图像都通过几个继承pygame sprite类的类加载。目前,我加载图像作为一类级别属性,如这样的:每帧加载和blitting图像?

class Laser(pygame.sprite.Sprite): 
    image = None 

    def __init__(self, start_x, start_y): 
     pygame.sprite.Sprite.__init__(self) 

     self.pos_x = start_x 
     self.pos_y = start_y 

     if Laser.image is None: 
      Laser.image = pygame.image.load('img/laser_single.png') 
     self.image = Laser.image 
     self.rect = self.image.get_rect() 
     self.rect.topleft = [self.pos_x, self.pos_y] 

我希望这可以防止Python从每次我创建一个新的激光时间(加载图像的新实例到内存)。但是,这会按我的预期工作吗?

第二个问题源于将所有活动的精灵都传送到pygame表面。目前,我在调用pygame.display.update()之前,循环访问Laser(),Enemy()以及各个对象并逐个blit。看起来多余的东西必须单独blit每个对象,所以我问这是否是pygame实现的最有效的方法。或者,是否有办法一次消除每个对象并看到某种性能改进?

+0

我不认为通过列表循环对性能有显著的影响。但是如果在多个帧中有很多精灵保持在同一位置,那么查看'BigYellowCactus'来避免在每一帧上都会出现这些精灵。 – pmoleri

回答

2
  • 我希望这可以防止每次创建新的激光()时,Python将图像的新实例加载到内存中。但是,这会按我的预期工作吗?

是的。这不仅节省了内存,因为每个实例只会引用类变量,它还会提高性能,因为图像只加载一次。

  • 第二个问题是将所有活动精灵分块到pygame表面。

这取决于。如果你的帧率是好的,然后坚持下去。如果你的帧率开始下降,看看DirtySprite,也许这article

另一个可派上用场的python类是LayeredDirty sprite组,它将自动处理脏精灵并仅更新相关屏幕部件,而不是整个屏幕。

  • 它似乎是多余的,以得的blit每个对象单独

随着子画面组,如例如LayeredDirty或简单的Group,你可以将小精灵添加到组中,只需调用精灵组的draw方法即可。

sprites = pygame.sprite.LayeredDirty((sprite1, sprite2, sprite3)) 
sprites.add(sprite4) 
... 
sprites.draw(pygame_screen) 

使用的精灵群体也将让你做团体之间的简单碰撞检测使用pygame.sprite.groupcollidepygame.sprite.spritecollideany