我最近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卡。
任何意见/想法表示赞赏。
请注意,默认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挂钩的情况下,但内部渲染循环以最大可能的速度流逝。
我不喜欢代码带走控制,因此我的补丁让我决定事件发生时呈现。
嗯..你可能想知道哪些游戏运行帧率,如果有帮助:
cldis = pyglet.clock.ClockDisplay()
然后添加到您的on_draw功能:
cldis.draw()
它汲取电流FPS在屏幕中的半透明颜色的BOTTOMLEFT角落。
我知道,在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