3

さて、私は Pyglet で小さなゲーム/プロトタイプを作成しています。イベントについて混乱しています。ゲームはうまく動作しません.プロファイリングによりon_draw()pyglet.clock.schedule_interval(). on_draw()が現在、手に入れることができるすべての CPU を使用している理由が正確にはわかりません。さらにプロファイリングを行うと、100 個のスプライトを描画するのに、必要以上に多くの CPU が必要であることがわかります (CPU を使用する必要があるのか​​、GPU のみを使用する必要があるのか​​さえわかりません)。

  1. はデフォルトで何on_draw()をしますか? 無駄な余分なものを避けることができますか?
  2. schedule_interval()トリガーしないようにするにはどうすればよいon_draw()ですか?
  3. 効果的な描画/ブリッティング方法はありますか?

いくつかのコード:

screen = pyglet.window.Window(800, 600, vsync=False, caption="Project")

tileimage = pyglet.image.create(50, 50, pyglet.image.SolidColorImagePattern((0, 255, 0, 255)))

class tileclass(pyglet.sprite.Sprite):
    def __init__(self, x, y):
        pyglet.sprite.Sprite.__init__(self, tileimage)
        self.x = x
        self.y = y
        self.rect = pygame.Rect(self.x - self.width / 2, self.y - self.height / 2, self.width, self.height)
        self.image.anchor_x = self.width // 2
        self.image.anchor_y = self.height // 2

tiles = []

x = 25
y = 25
for i in range(100):
    tiles.append(tileclass(x, y))
    if x == 475:
        x = 25
        y+=50
    else:
        x+=50

@screen.event
def on_draw():
    screen.clear()
    for t in tiles:
        t.draw()
    fps.draw()

pyglet.clock.schedule_interval(update, 1/60) #Logic stuff

ありがとう。

4

1 に答える 1

5

スプライトをバッチに追加して、代わりにそれを描画してみてください。pygletでは、OpenGLの動作方法として、描画呼び出しを行うのが遅いです。基本的には、ドローの数を最小限に抑え、可能な限りまとめてまとめたいと考えています。バッチを作成し、それにすべてのスプライトを追加して、最後にバッチのみを描画することで、例が大幅に改善されました。

http://pyglet.org/doc/programming_guide/displaying_images.html#sprites

これは、小さい画像が大きい画像よりも安価であり、通常、描画するピクセルを少なくすることでゲームを高速化するpygameとは少し対照的です(通常、最後のフレーム以降に変更された画面の一部のみを再描画します)。

于 2012-09-14T20:20:21.410 に答える