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

SDL2 hardware accelerated renderer crashes linux when using Proprietary drivers on xubuntu 12.04?

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

起初我使用的是 xorg nvidia driver,我的代码使用的是硬件加速渲染(即在创建 SDL_Renderer 时使用 SDL_RENDERER_ACCELERATED 标志)但是当我 运行 我的代码我的帧率很差~100FPS,请记住,此时我只是通过在屏幕上绘制一个小动画来测试它,在 windows 我得到~1200FPS。

我的想法可能是因为图形 driver。所以我为我的 GPU 切换到推荐的 nvidia 专有 driver,重新启动,重新编译,然后再次 运行 我的游戏。然后出现一个空的 window,我的电脑死机了,但是 window 标题中的 FPS 计数器报告了 ~15000 FPS(哇哦!)。我叹了口气,开始猛击我的键盘,ctrl-alt-del 将我注销,然后我重新登录到与之前相同的冻结屏幕。

在 hard-restart 之后,我检查了我的测试程序的日志,它报告说它成功进入了游戏循环,即开始渲染帧。

现在,如果我在主循环中添加延迟或使用 vsync,一切都很好(使用专有 nvidia driver 时速度更快),没有崩溃。一切如定义。

我对正在发生的事情感到困惑,我知道如果我没有在那里睡觉,我的程序会尽可能快地运行,但我不会认为调度程序会给出它如此多的处理器时间以至于忽略了系统的其余部分。我试着研究 Windows 和 linux 调度程序之间的区别,但我找到了一个可靠的理由来说明为什么我的程序会 运行 离开 linux。

您可以在此处查看库代码:https://github.com/callumW/Howler 库在 Howler/ 中,测试程序在 testsrc/ 中,主循环在 Game.cpp: 运行() .

(附带说明,如果您对库代码有任何建议,我很乐意接受)。

有人知道发生了什么事吗?

很明显,我需要限制帧速率,而且我并不缺少 FPS,这不是问题。我还认为这是避免不必要地使用电源的好习惯。但这激起了我的兴趣,我想知道是否有人能为我解答。

未来提示 - 无需重新启动。启用 X kill sequence(通常是 ctrl-alt-backspace,但在现代发行版中默认禁用,你必须手动启用它)作为最后的手段,但通常它只是 ctrl-alt-f1,登录到 tty,kill offending处理,然后 return 使用 ctrl-alt-fN 返回 X(X 所在的 tty 数量,通常为 7)。如果您正在处理图形,您可能迟早会需要它。

不确定您的问题是否与我在 运行 您的程序中看到的完全相同,但很可能是这样。您在 window 标题中显示 FPS,每帧将其发送到 window 管理器,每秒 15000 次。 Window 经理对如此多的 window 标题更新感到困惑(至少 openbox 是这样。尚未使用不同的 WM 进行测试)。不确定它最终是否会刷新累积的更改或永远挂起;没等到。

基本上每秒更新 window 标题的频率不要超过 10 次。

我会在主循环中添加 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时间还给OS。在某些 OS 中(如果我没记错的话,就像旧的 Windows 一样)如果你无限旋转循环,你的应用程序将冻结,OS 会认为你的应用程序没有响应并会尝试终止它。等等

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