gpt4 book ai didi

python - Pyglet 使用过多的 CPU

转载 作者:太空宇宙 更新时间:2023-11-04 01:35:17 25 4
gpt4 key购买 nike

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

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

我决定以每秒 60 帧的速度渲染 1000 个和 10000 个 Sprite ,令我惊讶的是 CPU 使用率保持在 50%。唯一的问题是移动或动画 Sprite 会导致轻微的卡顿。

最后,我尝试以每秒 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。

欢迎任何建议/想法。

最佳答案

请注意,默认的 pyglet 事件处理程序会在每次清除事件队列时触发“on_draw”事件。

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

The pyglet application event loop dispatches window events (such as for mouse and keyboard input) as they occur and dispatches the on_draw event to each window after every iteration through the loop.

这意味着任何事件都可以触发重绘

因此,如果您四处移动鼠标或做任何会触发事件的事情,当它开始触发渲染调用时,您的速度会大幅下降。

这也导致了问题,因为我正在执行自己的渲染调用,因此我会导致两个缓冲区发生冲突,从而在屏幕上产生“重影”效果。我花了一段时间才意识到这是原因。

我猴子修补了事件循环,不这样做。 https://github.com/adamlwgriffiths/PyGLy/blob/master/pygly/monkey_patch.py

请注意,此修补后的事件循环将不再自行呈现,您必须手动翻转缓冲区或触发“on_draw”事件。

可能是这样的情况,虽然您以 60fps 的速度连接,但内部渲染循环正在以最大可能的速率滴答作响。

我不喜欢剥夺控制权的代码,因此我的补丁让我决定渲染事件何时发生。

关于python - Pyglet 使用过多的 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10524093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com