2012-09-16 32 views
1

和上次一樣,我遇到了一個新問題。當我移動鼠標時,FPS從大約60增加到500以上。我知道你在想什麼;這是不是因爲on_draw()被炒每個事件(我認爲),因爲我已經做了pyglet.app.EventLoop.idle覆蓋:更多Pyglet - 禁止鼠標移動事件?

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應該採取行動的方式,或者應該避免這種情況,那麼仍然很好。

+0

可能的重複[在Python中使用pyglet,爲什麼我的幀速率加快,如果我鼠標拖動?](http://stackoverflow.com/questions/10523931/using-pyglet-in-python-why-does -my-frame-rate-speed-up-if-i-mouse-drag) – timday

+0

我同時執行'schedule_interval'和'set_fps_limit',並且遊戲在沒有事件的情況下運行60-80 fps。 – Syklis

回答

1

所有你應該在鼠標事件上做的事情是更新你的應用程序的輸入控制狀態模型,並在下一次定期更新和重新顯示世界模型中使用它(這可能比物理和渲染更復雜,東東)。

即僅僅因爲鼠標事件進入〜300fps並不意味着你實際上必須做所有你想做的事情在300fps。

這已經有一段時間,因爲我沒有任何Pyglet,但我似乎使用模式是子類Pyglet的window.WindowMyGameWindow,那麼註冊的事件處理像

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

(也on_mouse_dragon_mouse_presson_mouse_release) 。嗯......實際上,我認爲指派給self.invalid可能對覆蓋Pyglet的默認行爲至關重要,並推遲進行任何進一步的更新/繪圖,直到下一個「時鐘滴答」爲止。

+1

這是我現在正在做的另一種解決方案,如果您在鼠標移動事件或'on_draw()'中設置'self.invalid = False',似乎並不重要。一旦你想要重畫屏幕,例如在你的更新功能中,你必須將其設置爲「True」。此外,鼠標事件仍然會觸發時鐘滴答聲,因此「ClockDisplay」的FPS計數器發生了變化。 – Syklis