在xubuntu 12.04上使用专有驱动程序时,SDL2硬件加速渲染器崩溃linux?

时间:2016-06-18 22:59:31

标签: c++ linux sdl

我正在使用SDL在C ++中创建一个小型2D游戏库(那个正确的世界,另一个!)我终于在linux上测试了它的当前状态(非常多的工作)(xubuntu) 12.04)。到目前为止,我大部分时间都在使用Windows 10安装。注意:我的linux和Windows 10安装在同一台机器上。

起初我使用的是xorg nvidia驱动程序,我的代码使用硬件加速渲染(即在创建SDL_Renderer时使用SDL_RENDERER_ACCELERATED标志)但是当我运行代码时,我的帧速率变差~100FPS,请记住在这一点上,我只是通过在屏幕上绘制一个小动画来测试它,在窗口上我得到了~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,这不是问题。我还假设这是不必要地使用电源的好习惯。但这引起了我的兴趣,我想知道是否有人对我有答案。

2 个答案:

答案 0 :(得分:1)

未来的提示 - 无需重启。启用X kill序列(通常是ctrl-alt-backspace,但默认情况下在现代发行版中禁用,你必须手动启用它)作为最后的手段,但通常它只是ctrl-alt-f1,登录到tty,kill kill违规进程,然后使用ctrl-alt-fN(X所在的tty的数量,最常见的是7)返回到X.如果你正在使用图形,你可能迟早会需要它。

不确定您的问题是否与我在运行程序时看到的完全相同,但很可能是这样。您在窗口标题中显示FPS,每帧发送到窗口管理器,每秒15,000次。窗口管理器因为这么多窗口标题更新而感到困惑(至少openbox没有。没有使用不同的WM进行测试)。不确定它是否会最终冲洗累积的变化或永远挂起;没等。

基本上不要每秒更新窗口标题超过10次。

答案 1 :(得分:0)

我在主循环中添加SDL_Delay()。类似的东西: -

while(running) {
    while(SDL_PollEvent(&e) != 0) {
        if(e.type == SDL_KEYDOWN) {
            if(e.key.keysym.sym == SDLK_ESCAPE) {
                running = false;
                break;
            }
        }
        else if(e.type == SDL_QUIT) {
            running = false;
            break;
        }
    }
    update();
    frames++;
    //Add a delay here
    SDL_Delay(0);
}

这是为了将cpu时间返回给操作系统。在某些操作系统(如旧版Windows,如果我没有记错),如果你无限循环,你的应用程序将冻结,操作系统会认为你的应用程序没有响应,并会试图杀死它。等等。

我不确定这是不是你的情况,试一试。您可能想要更改参数的值(实际上它是您想要延迟的时间长度,但不能保证精确)。在我不想限制帧速率的情况下,我通常使用0113会将您的帧率限制在60fps左右。

相关问题