2

私は最近、pygame から pyglet と rabbyt を始めましたが、レンガの壁のようなものにぶつかりました。

1 つのスプライト (pyglet.sprite.Sprite にあるタイプ) が 60 フレーム/秒で表示される基本的な例を作成しました。問題は、この単純なプログラムが何らかの理由で CPU 時間の 50% を使用していることです。Rabbyt ライブラリにあるスプライト タイプで実験を繰り返しましたが、結果は同じでした。

1 秒あたり 60 フレームで 1000、次に 10,000 のスプライトをレンダリングすることにしましたが、驚いたことに、CPU 使用率は 50% のままです。唯一のことは、スプライトを移動またはアニメーション化すると、わずかにスタッターが発生することです。

最後に毎秒360コマで走ってみました。同じ結果、50% の使用率。

サンプルコードは次のとおりです。

import pyglet
import rabbyt


def on_draw(dt):
    window.clear()
    spr.render()

global window
window = pyglet.window.Window(800, 600)
spr = rabbyt.Sprite('ship.png')
spr.x = 100
spr.y = 100
pyglet.clock.schedule_interval(on_draw, 1.0/60.0)


if __name__ == '__main__':
    pyglet.app.run()

Core 2 Duo と ATI HD 3500 カードを使用しています。

アドバイスやアイデアをいただければ幸いです。

4

3 に答える 3

2

デフォルトの pyglet イベント ハンドラは、イベント キューをクリアするたびに「on_draw」イベントを発生させることに注意してください。

http://www.pyglet.org/doc/programming_guide/the_application_event_loop.html

pyglet アプリケーション イベント ループは、発生したウィンドウ イベント (マウスやキーボード入力など) をディスパッチし、ループを反復するたびに on_draw イベントを各ウィンドウにディスパッチします。

これは、どのイベントでも redraw をトリガーできることを意味します。

そのため、マウスを動かしたり、イベントを発生させる何かを行ったりすると、レンダリング コールがトリガーされ始めるため、大幅な速度低下が発生します。

これも、私が独自のレンダー コールを行っていたため、問題が発生しました。そのため、2 つのバッファーが競合して、画面に「ゴースト」効果が生じていました。これが原因だと気付くのに時間がかかりました。

これを行わないように、イベントループにパッチを適用しました。 https://github.com/adamlwgriffiths/PyGLy/blob/master/pygly/monkey_patch.py

このパッチを適用したイベント ループは、単独ではレンダリングされないことに注意してください。手動でバッファーを反転するか、「on_draw」イベントをトリガーする必要があります。

60 fps で接続しているにもかかわらず、内部レンダリング ループが可能な限り最大の速度で動作している場合があります。

コントロールを奪うコードは嫌いなので、私のパッチではレンダリング イベントがいつ発生するかを決定できます。

于 2012-05-16T06:42:01.200 に答える
1

うーん..それが役立つ場合は、ゲームが実行される fps を知りたいと思うかもしれません:

cldis = pyglet.clock.ClockDisplay()

次に、これを on_draw 関数に追加します。

cldis.draw()

画面の左下隅に現在の fps を半透明の色で描画します。

于 2012-11-12T14:49:09.513 に答える
0

Pygameには「Clock」と呼ばれる組み込みがあることを知っています。tick メソッドを使用して、1 秒間にゲームがループする回数を制限できます。私の例では、30 FPS の制限を設定しました。これにより、CPU が常にオンデマンドになるのを防ぎます。

clock = pygame.time.Clock() 

While 1:

    clock.tick(30) # Puts a limit of 30 frames per second on the loop

pyglet には、似たようなものがあるようです:

    pyglet.clock.schedule_interval(on_draw, 1.0/60.0)
    clock.set_fps_limit(60)

それが役立つことを願っています!

編集: fps 制限に関するドキュメント: http://pyglet.org/doc/api/pyglet.clock-module.html#set_fps_limit

于 2012-05-10T03:07:20.580 に答える