-->

Pyglet占用太多的CPU(Pyglet uses too much cpu)

2019-09-17 03:48发布

我最近startet进入从pygame的pyglet和rabbyt,但我撞到南墙的东西。

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

我决定以每秒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卡。

任何意见/想法表示赞赏。

Answer 1:

请注意,默认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挂钩的情况下,但内部渲染循环以最大可能的速度流逝。

我不喜欢代码带走控制,因此我的补丁让我决定事件发生时呈现。



Answer 2:

嗯..你可能想知道哪些游戏运行帧率,如果有帮助:

cldis = pyglet.clock.ClockDisplay()

然后添加到您的on_draw功能:

cldis.draw()

它汲取电流FPS在屏幕中的半透明颜色的BOTTOMLEFT角落。



Answer 3:

我知道,在Pygame中有一个名为“时钟”的内置。 你可以把游戏的每秒使用刻度方法多少次循环的限制。 在我的例子我已经把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



文章来源: Pyglet uses too much cpu