【问题标题】:Allow SDL to bypass X server under LinuxLinux下允许SDL绕过X server
【发布时间】:2012-01-16 18:36:54
【问题描述】:

在我尝试在 Linux 下使用 SDL 制作一个简单的游戏时,我注意到使用普通的 X11 后端,它在 800x600x32 下以大约 60 FPS 的速度运行,在 1024x768x32 下以 20 FPS 左右的速度运行,这是相当不错的带有精灵和一些 32x32 瓷砖的简单 2D 游戏的大量下降。我做了一些研究,发现 X server 不允许他的客户端直接访问视频硬件,迫使程序使用软件表面和许多 CPU 周期。一些提供的解决方案据说将 envvar SDL_VIDEODRIVER 设置为“dga”,并使用 XFree86 DGA 驱动程序绕过 X 服务器。我已经安装了 DGA 开发包 libxxf86dga-dev(在 Ubuntu 下),但是当尝试这个时:

putenv("SDL_VIDEODRIVER=dga");

if(SDL_Init(SDL_INIT_VIDEO) == -1)
{
    std::cout << "Init video error" << std::endl;
    return -1;
}

程序刚刚退出,出现“没有可用的视频设备”错误。我已经给它超级用户权限,但它没有帮助。有任何想法吗?这种方法是否仍然有效,或者除了切换到 OpenGL 之外还有其他解决方案吗?我正在使用 SDL 1.2。

【问题讨论】:

  • 你说程序出错退出,那是什么错误?
  • 从谷歌的快速浏览来看,OpenGL 似乎是获得硬件加速的推荐方式。 Dga 似乎也有几个缺点,以超级用户身份运行对我来说是最明显的,但糟糕的驱动程序支持似乎也是一个问题。
  • @JoachimPileborg 抱歉,忘了说。错误是“没有可用的视频设备”。
  • @r_ahlskog 好吧,从我在使用 SDL 创建的许多 2D 游戏中看到的情况来看,它们使用 DGA 驱动程序,这就是为什么尝试在我的机器上运行这些游戏会导致同样的错误。我想避免为这么简单的游戏学习 OpenGL。
  • @Narrakan:我绝不是 DGA 或其他方面的专家,我只是该领域的高级 Google 过滤器。但是我发现this 表明除鼠标输入之外的 DGA 可能不再可用。

标签: c++ sdl


【解决方案1】:

你可能会考虑这些问题

  • 是否渲染到硬件缓冲区? (SDL_HWSURFACE 标志)
  • 所有精灵和瓷砖都在同一个表面上?
  • 您是否在硬件表面上存储图块和精灵?
  • 保存图块和精灵的表面与视频显示器使用的像素格式相同?

【讨论】:

  • 我不渲染到硬件缓冲区,因为 X 服务器不允许访问它。精灵和瓦片位于两个不同的表面上,并在需要时在屏幕上显示。是的,表面不是硬件,而是相同的格式。
  • 如果你只做纯位图而不是像素级的东西,你仍然可以尝试使用 SDL_HWSURFACE。它可以有所作为,实际经验。另外,我发现当显示为 32 位时,渲染到 16 位会严重影响速度。
  • 我尝试使用 SDL_HWSURFACE 标志,但是当我在使用这些标志调用 SDL_SetVideoMode() 函数后检查当前标志时,它只是返回 SDL_SWSURFACE。至于16位渲染,我还没试过。
  • 啊,好吧,那么 SDL 1.2 听起来确实注定要失败。如果您使用 1.3 新 API,SDL 1.3 提供开箱即用的 OpenGL 支持的位图。对于 16 位,不,恰恰相反,我注意到以 16 位渲染是一种性能。如果视频是 32 位,则杀手 ^^
  • 好吧,也许我会看看 1.3 API,即使它们还没有准备好生产。还是谢谢^^
猜你喜欢
  • 1970-01-01
  • 2017-11-26
  • 2011-11-25
  • 2016-01-19
相关资源
最近更新 更多