ガラガのシンプルなトップダウンの縦型シューティングゲームをいじっています。ただし、ドキュメントを確認した後、画像を効率的に読み込む方法と、フレームごとに画像をブリットするかどうかについて少し混乱しました。すべての画像は、pygameスプライトクラスを継承するいくつかのクラスを介してロードされます。現在、画像をクラスレベルの属性として読み込んでいます。
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]
これにより、新しいLaser()を作成するたびに、Pythonが画像の新しいインスタンスをメモリにロードするのを防ぐことができます。しかし、これは私が期待するように機能しますか?
2番目の問題は、すべてのアクティブなスプライトをpygameの表面にブリットすることから生じます。現時点では、Laser()、Enemy()、およびwhatnotオブジェクトのリストをループし、pygame.display.update()を呼び出す前に、それぞれを個別にブリットします。各オブジェクトを個別にブリットする必要があるのは冗長なように思われるので、これがpygameが実装する最も効率的な方法であるかどうかを尋ねています。または、すべてのオブジェクトを一度にブリットして、ある種のパフォーマンスの向上を確認する方法はありますか?