0

ガラガのシンプルなトップダウンの縦型シューティングゲームをいじっています。ただし、ドキュメントを確認した後、画像を効率的に読み込む方法と、フレームごとに画像をブリットするかどうかについて少し混乱しました。すべての画像は、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が実装する最も効率的な方法であるかどうかを尋ねています。または、すべてのオブジェクトを一度にブリットして、ある種のパフォーマンスの向上を確認する方法はありますか?

4

1 に答える 1

2
  • これにより、新しい Laser() を作成するたびに Python がイメージの新しいインスタンスをメモリにロードするのを防ぐことができます。しかし、これは私の予想どおりに機能しますか?

はい。これによりメモリが節約されるだけでなく、すべてのインスタンスがクラス変数への参照を持つだけになるため、イメージが 1 回だけ読み込まれるため、パフォーマンスも向上します。

  • 2 番目の問題は、すべてのアクティブなスプライトを pygame サーフェスにブリットすることです。

これは依存します。フレームレートが問題ない場合は、そのままにしてください。フレームレートが低下し始めた場合はDirtySprite、 とこの記事を参照してください。

便利なもう 1 つの Python クラスはLayeredDirtyスプライト グループです。これは、ダーティ スプライトを自動的に処理し、画面全体ではなく関連する画面部分のみを更新します。

  • 各オブジェクトを個別にブリットする必要があるのは冗長に思えます

LayeredDirtyや simpleなどのスプライトグループでは、Groupスプライトをグループに一度追加し、drawスプライト グループのメソッドを呼び出すだけです。

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

スプライト グループを使用すると、 と を使用してグループ間の簡単な衝突検出を行うこともできますpygame.sprite.groupcollidepygame.sprite.spritecollideany

于 2012-08-22T13:02:34.390 に答える