1

前回と同じゲームで、新たな問題に遭遇しました。マウスを動かすと、FPSは約60から500以上に増加します。あなたが何を考えているかはわかります。on_draw()私はすでにオーバーライドを行ったので、それは各イベント(私は思う)が解雇されたためではありませんpyglet.app.EventLoop.idle

class EventLoop:
    def idle(self):
        pyglet.clock.tick(poll=True)
        return pyglet.clock.get_sleep_time(sleep_idle=True)

pyglet.app.EventLoop = EventLoop()

flip()また、描画関数でウィンドウを呼び出します。役に立たないマウスモーションイベントはすべてCPUを大量に消費するため、煩わしいものです。私はそれについて何ができますか?

編集

window.invalid = False描画機能とwindow.invalid = True更新機能を追加しましたが、これにより他のマウス操作でのCPU使用率が低下するようです。

編集2

描画機能は代表的なon_draw()機能です。

編集3

さらに調査したところ、これらのイベントはすべて、私が思っていたほど多くのCPUを使用していないようです。それでも、これがPygletの動作方法であるのか、それとも避けるべきものであるのかを知ることは良いことです。

4

1 に答える 1

1

マウスイベントで行う必要があるのは、入力制御状態のアプリのモデルを更新し、それを次の定期的な更新とワールドモデルの再表示(おそらく物理学やレンダリングなどではるかに複雑)で使用することです。

つまり、マウスイベントが約300 fpsで発生するからといって、実際に300fpsで実行したいすべてのことを実行する必要があるわけではありません。

Pygletを実行してからしばらく経ちましたが、使用したと思われるパターンは、Pygletをサブクラス化することでした。その後、登録されたイベントハンドラーは次のwindow.WindowようMyGameWindowになります。

   @self.event
    def on_mouse_motion(x,y,dx,dy):
        self.mouse_position=(x,y)
        self.mouse_buttons=0
        self.invalid = False

(またon_mouse_drag、、、on_mouse_presson_mouse_release。うーん...実際には、への割り当ては、self.invalidPygletのデフォルトの動作をオーバーライドし、次の「クロックティック」までそれ以上の更新/描画を延期するために重要だったと思います。

于 2012-09-17T09:29:06.357 に答える