【发布时间】:2016-06-23 14:43:44
【问题描述】:
我正在使用 SDL 在 C++ 中创建一个小型 2D 游戏库(这是正确的世界,另一个!),我终于开始在 linux(xubuntu 12.04)上测试它的当前状态(正在进行中的工作)。到目前为止,我大部分时间都在安装 Windows 10。注意:我的 linux 和 windows 10 安装在同一台机器上。
起初我使用的是 xorg nvidia 驱动程序,我的代码使用的是硬件加速渲染(即在创建 SDL_Renderer 时使用 SDL_RENDERER_ACCELERATED 标志)但是当我运行我的代码时,我的帧速率很差~100FPS,请记住在这一点上,我只是通过在屏幕上绘制一个小动画来测试它,在 Windows 上我得到了 ~1200FPS。
我的想法可能是由于图形驱动程序。所以我为我的 GPU 切换到推荐的 nvidia 专有驱动程序,重新启动、重新编译并再次运行我的游戏。然后出现了一个空窗口,我的电脑死机了,但窗口标题中的 FPS 计数器报告了 ~15000 FPS(哇哦!)。我叹了口气,开始敲击键盘,按 ctrl-alt-del 将我注销,然后我又重新登录到与以前相同的冻结屏幕。
硬重启后,我检查了我的测试程序的日志,它报告它成功进入游戏循环,即开始渲染帧。
现在,如果我在主循环中添加延迟或使用 vsync 一切都很好(使用专有的 nvidia 驱动程序时速度更快),没有崩溃。一切按照定义。
我对正在发生的事情感到困惑,我知道如果我没有在那里睡觉,我的程序会尽可能快地运行,但我不会想到调度程序会给它这么多处理器时间忽略系统的其余部分。我尝试研究 Windows 和 linux 调度程序之间的差异,但我可以找到一个充分的理由来解释为什么我的程序会在 linux 上失控。
您可以在此处查看库代码:https://github.com/callumW/Howler 库在 Howler/ 中,测试程序在 testsrc/ 中,主循环在 Game.cpp 中:run()。
(附带说明,如果您对库代码有任何建议,我很乐意收到)。
有人对正在发生的事情有任何想法吗?
很明显,我需要限制帧速率,因为我并不缺少 FPS,所以这不是问题。我还认为这是一种很好的做法,因为它不会不必要地使用电源。但这引起了我的兴趣,我想知道是否有人能回答我。
【问题讨论】: