我最近开始从 pygame 开始接触 pyglet 和 rabbyt,但我遇到了一些障碍。
我创建了一个基本示例,其中一个 Sprite(在 pyglet.sprite.Sprite 中找到的类型)以每秒 60 帧的速度显示。问题是这个简单的程序不知何故占用了 50% 的 CPU 时间。我用rabbyt库中找到的精灵类型重复了实验,得到了相同的结果。
我决定以每秒 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()
我使用的是 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”事件。
可能的情况是,虽然您已经以 60 fps 的速度连接,但内部渲染循环正在以最大可能的速率运行。
我不喜欢夺走控制权的代码,因此我的补丁让我决定渲染事件何时发生。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)