为什么SDL_PollEvent如此缓慢?

3
我一直在开发一个模拟器作为副业,现在我正在处理效率问题。我已经成功地摆脱了所有慢速的事情,比如大量的SDL_RenderDrawPoint,但现在我卡住了。
我已经将问题缩小到了SDL_PollEvent。我简化了我的主循环和事件循环,使它们看起来类似于一个简单的SDL教程。当我注释掉事件循环时,模拟器运行得非常快。我还使用了Visual Studio性能分析器进行检查,确实,SDL_PollEvent占用了约94%的CPU时间。

slow SDL_PollEvent

我的模拟器完成所有操作的地方是在ppuNptr->cycle(),只占用了1.48%的资源。
不幸的是,我无法在另一个项目中复制这个结果,所以我很困惑。
在轮询事件之前,我应该做些什么?
我还有其他的调试方法吗?
目前,我使用的是Windows 10,Visual Studio 2019和SDL 2.0.10。

1
大多数由SDL_PollEvent“返回”的事件都不是您要检查的那些,这意味着循环会迭代很多次并频繁调用SDL_PollEvent - undefined
1
游戏循环的一部分。除了呈现帧的渲染器和使物体移动的游戏对象更新器之外。当后两者不执行任何重要操作时,所有的 CPU 时间都用于事件轮询器。这告诉你基本上已经完成了优化工作。 - undefined
1
需要更多信息。我们在谈论什么性能水平和下降?类似的问题曾在Windows 10和SDL 2.0.9上报告过,但那应该早就解决了。您可以构建调试版本的SDL,以便在调试器中查看其内部情况。 - undefined
@Botje 我在考虑如果我的系统出现异常情况时打印出所有的事件,但是我不知道有没有一个好的方法来实现。SDL中是否有一个便捷的函数类似于 event_to_string() - undefined
1
@Tristus 作为一个快速测试,你可以尝试使用2.0.8版本。 - undefined
显示剩余6条评论
2个回答

2
我在调试模拟器时也遇到了这个问题。对我来说,解决方法是将SDL2版本降级到2.0.8。
我运行的是SDL2版本2.0.12,我采纳了评论中keltar的建议,将版本降级到2.0.8,这样就不再出现SDL_PollEvent导致性能下降的问题了。这个方法解决了我的低帧率问题。
我会查看漏洞跟踪系统,如果没有报告此问题,我会向SDL2报告,因为这个问题从2.0.9版本开始出现。

这是一个答案还是评论?如果是答案,请澄清答案是什么。 - undefined
这是对我的问题的答案,非常类似于Tristus的问题@teleman。对于任何困惑,我表示抱歉。对我来说,答案是将SDL2的版本降级到2.0.8。 - undefined
真不敢相信这个问题还没有解决!我建议向SDL开发人员提交一个错误报告。 - undefined
@HolyBlackCat,我采纳了你的建议,并向SDL开发人员提交了一个工单。这是链接地址:https://bugzilla.libsdl.org/show_bug.cgi?id=5171 - undefined
1
只是一个更新: 问题已经按照错误票据中所报告的得到解决。 - undefined

0

我的解决方法是将事件处理代码从主循环的外部移动到呈现代码中,这样每秒只运行60次(即16ms一次),而主循环以10Mhz运行;这意味着每个循环只有100纳秒!我通过这种方式将模拟器的速度从0.1Mhz提高到了10Mhz。

回顾过去,我想期望SDL_PollEvent在几个纳秒内运行似乎是不合理的。(尽管XCB能够实现。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接