2012-05-09 45 views
1

我最近剛剛從pygame進入pyglet和rabbyt,但我碰到了一堵磚牆。Pyglet使用太多的CPU

我創建了一個基本的例子,其中一個Sprite(pyglet.sprite.Sprite中的類型)以每秒60幀的速度顯示。問題是這個簡單的程序以某種方式佔用了CPU時間的50%。我重複了在rabbyt庫中找到的精靈類型的實驗,結果相同。

我決定渲染1000幀,然後以每秒60幀的速度渲染10000個精靈,令我驚訝的是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卡。

任何意見/想法表示讚賞。

+0

...你有沒有嘗試過損壞blitting? –

+0

不,我實際上並沒有意識到破壞。你能指出我的一些文件嗎? – Kiril

+0

不是真的,但它不是很難;只需將背景畫在精靈的舊位置上,然後在新位置繪製精靈。 –

回答

0

我知道在Pygame中有內置的「時鐘」。您可以限制遊戲每秒使用tick方法循環的次數。在我的例子中,我已經設置了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

+0

您是否嘗試過使用clock.set_fps_limit()方法?這可能有助於提高性能。 – scobuntu

+0

我已經使用clock.schedule_interval調度繪圖間隔; clock.set_fps_limit(60)沒有改變任何東西(我也嘗試了不同的幀值,如100和30) - 性能保持不變。 – Kiril

2

注意,默認pyglet事件處理程序會在每次清除事件隊列時觸發一個「on_draw」事件。

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

的pyglet應用事件循環調度窗口事件(如鼠標和鍵盤輸入),因爲它們發生,並通過循環每次迭代之後分派on_draw事件給每個窗口。

這意味着任何事件都可以觸發重繪

因此,如果您要移動鼠標或執行任何引發事件的事情,您將在開始觸發呈現調用時大量減速。

這也造成了問題,因爲我正在做我自己的渲染調用,所以我會得到兩個緩衝區在屏幕上創建'鬼'效應。花了我一段時間才意識到這是事業。

我猴子補丁事件循環不這樣做。 https://github.com/adamlwgriffiths/PyGLy/blob/master/pygly/monkey_patch.py

注意,這個補丁的事件循環將不再在它自己的渲染,你必須手動翻轉緩衝區或觸發「on_draw」事件。

可能是這樣的情況,儘管你已經以60fps的速度上鉤了,但內部渲染循環正在以最大可能速率滴答滴答。

我不喜歡帶走控件的代碼,因此我的補丁讓我可以決定渲染事件發生的時間。

1

嗯..你可能想知道哪些遊戲運行幀率,如果它可以幫助:

cldis = pyglet.clock.ClockDisplay() 

然後添加到您的on_draw功能:

cldis.draw() 

它汲​​取電流以半透明色顯示在屏幕左下角的fps。