Pyglet使用了太多的cpu

时间:2012-05-09 21:07:58

标签: python performance pyglet

我最近刚开始从pygame进入pyglet和rabbyt,但我遇到了一些砖墙。

我创建了一个基本示例,其中一个Sprite(在pyglet.sprite.Sprite中找到的类型)以每秒60帧的速度显示。问题是这个简单的程序以某种方式耗尽了50%的CPU时间。我用Rabbyt库中的sprite类型重复了实验,结果相同。

我决定以每秒60帧的速度渲染1000个然后是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()

我正在使用带有ATI HD 3500卡的Core 2 Duo。

任何建议/想法都表示赞赏。

3 个答案:

答案 0 :(得分: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 :(得分:1)

嗯..你可能想知道游戏运行的fps,如果它有帮助:

cldis = pyglet.clock.ClockDisplay()

然后将此添加到您的on_draw函数:

cldis.draw()

它以半透明的颜色在屏幕的左下角绘制当前的fps。

答案 2 :(得分:0)

我知道在Pygame中有一个名为“Clock”的内置程序。您可以使用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