微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

pygame.event 和 pygame.fastevent 有什么区别? 那有什么区别?

如何解决pygame.event 和 pygame.fastevent 有什么区别? 那有什么区别?

根据 pygame.event 文档,此函数从队列中获取所有事件。

从队列中获取事件
get(eventtype=None) -> 活动列表
get(eventtype=None,pump=True) -> 活动列表
这将获取所有消息并将它们从队列中删除

根据 pygame.fastevent 文档,此函数从队列中获取所有事件。

从队列中获取所有事件
get() -> 活动列表
这将获取所有消息并将它们从队列中删除

那有什么区别?

我认为区别在于多线程:event “应该从主线程调用fastevent 用于“多线程环境” - 但我没有看到任何区别(例如在 this 情况下)

解决方法

fastevent 背后的想法是消除 SDL 事件处理代码中的一些限制,使其能够每秒处理超过 12,700 个事件。

您仍然可以找到原始文档 herehere。一些引用:

深入研究 SDL_WaitEvent() 代码时,我对 SDL 旨在在不支持线程的操作系统上工作这一事实感到不寒而栗。 SDL_WaitEvent 以最简单的方式等待事件到达队列,它使用 SDL_Delay() 等待 10 毫秒,然后检查是否有任何事件在等待。每秒检查队列 100 次并可能每秒轮询输入事件 100 次对于单线程游戏来说非常棒,无论您的操作系统是否支持线程,它都会为您提供相同的结果。 ...

为了弄清楚测试应该运行多快,我查看了 SDL 事件代码,发现队列最多可以容纳 127 个项目,并且由于 SDL_WaitEvent() 每秒查看队列 100 次,我们知道 SDL_WaitEvent() 可以不删除超过 (127 * 100) = 12,700 个事件/秒,并且您不能在一秒钟内将超过 12,700 个事件推送到队列中。 ...

因为我想为客户端和服务器使用相同的库,所以我想看看我是否可以让这段代码运行得更快一点。 ...

下一步是编写我自己的 SDL_WaitEvent() 版本并使用信号量和条件变量来控制对事件队列的访问。信号量是一种简单的互斥运算符,也称为互斥锁。线程使用互斥锁来防止多个线程同时接触变量或运行一段代码。有多个线程同时更改相同的数据会导致难以发现的可怕错误。在这种情况下,我需要一个互斥锁来保持队列的内容一致。条件变量只是一个线程让其他线程知道发生了某些事情的一种方式。一个或多个线程可以等待某个条件,并且当另一个线程发出信号表示该条件已发生时,等待的线程将唤醒并开始他们的工作。 ...

当我测试该代码时,我发现它获得了 SDL 事件,并且每秒能够将超过 30,000 个事件从我的事件推送线程推送到主 SDL 线程。我相信我看到的速度仅受我的测试机器的速度的限制,而不受我的代码或 SDL 中的任何内容的限制。 ...

请注意,这并没有消除事件处理函数必须是 从主 SDL 线程调用。但它允许您从其他线程安全地发布事件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。