【问题标题】:SDL_GetNumVideoDisplays() returns 1 when I have 2 monitors当我有 2 台显示器时,SDL_GetNumVideoDisplays() 返回 1
【发布时间】:2016-05-23 01:40:09
【问题描述】:

晚上好。

我正在远程计算机上设置我的游戏项目,但遇到了 SDL 问题。我正在使用 SDL 2.0,我试图弄清楚为什么当我有 2 台显示器连接到我的 PC 时 SDL_GetNumVideoDisplays() 返回 1。我正在运行 Ubuntu 14.04 LTS,两个显示器似乎都配置正确,只是正常使用桌面。

不胜感激有关在何处解决此问题的提示。谢谢。


更新 1 - ./configure 用于 SDL2-2.0.4 源代码

在配置脚本中寻找有关 X11 的内容,并看到以下内容:

checking for X11/extensions/Xext.h... yes
-- dynamic libX11 -> libX11.so.6
-- dynamic libX11ext -> libXext.so.6
checking for const parameter to XextAddDisplay... yes
checking for XGenericEvent... yes
checking for XkbKeycodeToKeysym in -lX11... yes
checking for X11/Xcursor/Xcursor.h... no
checking for X11/extensions/Xdbe.h... yes
checking for X11/extensions/Xinerama.h... no
checking for X11/extensions/XInput2.h... no
checking for X11/extensions/scrnsaver.h... no
checking for X11/extensions/shape.h... yes
checking for X11/extensions/xf86vmode.h... yes

X11 libraries   : xdbe xshape xvidmode

我的xrandr --version 是:

xrandr program version       1.4.1
Server reports RandR version 1.4

我的安装似乎不支持xrandr --listactivemonitors


更新 2 - 重新安装操作系统,彻底擦除分区

当我决定只选择核选项时,今天事情迅速升级。幸运的是,我需要的磁盘上没有任何内容,因为我刚刚克隆了我的 repo,并且没有做出任何值得提交的更改。

在开放驱动程序和专有驱动程序之间交换一天并修改我的 xorg.conf 后,我最终对磁盘进行了核对并安装了 16.04 LTS。我从 ubuntu 存储库安装了 SDL2 运行时,并从 SDL 网站上的 tar 文件安装了 SDL2 开发源。再次运行我的程序,它按预期运行。

我不想将其称为“已解决”,因为我最终对我的操作系统进行了核对,但我想我的问题已经解决了。我只是希望我能弄清楚 SDL 如何获知有多少显示器的信息链。

【问题讨论】:

  • 好的,您想要的是<X11/extensions/Xrandr.h>,请致电XRRGetMonitors ... 现在,SDL 是否有此功能?我看到一堆 other XRandR 调用,但不是那个......
  • 嗯,但 SDL 确实 调用 XRRGetScreenResources,其中包含有关“输出”的信息,这可能是您想要的……请注意,SDL 会预先添加 all 带有X11_ 的符号,因为dlopen 诡计。
  • ... 除了那会调用SDL_AddVideoDisplay 并影响SDL_GetNumVideoDisplays 的返回值,这是你首先问的。那么,您是如何获得 SDL 的编译副本的呢?如果你自己编译,也许你错过了一些标题?
  • 是的,我是从源代码编译的。当我为 SDL2 执行 ./configure 时,我会检查当前打印的内容,看看是否能找到线索。
  • 我最终彻底清除了我的操作系统并安装了 Ubuntu 16.04 LTS。 SDL_GetNumVideoDisplays() 现在可以正确报告 2 个显示。我有点希望我知道老问题出在哪里,但我不再有它了。我很确定它在我的/etc 某处。

标签: c++ ubuntu sdl-2 multiple-monitors


【解决方案1】:

checking for X11/extensions/Xinerama.h... no

这可能就是你的鱼雷。 Xinerama is used to query the output count/positions/topology:

X 服务器的客户端/服务器架构允许服务器向客户端公开 Xinerama 信息,无论 Xinerama 基础结构是否处于活动状态。 RandR 和 NVidia 的 twinview 利用此功能为窗口管理器和客户端提供有关与帧缓冲区相关的输出布局的信息。

安装libxinerama-dev & re-configureing 可能会解决这个问题。

【讨论】:

  • 很高兴你发布了这个。在操作系统安装后,我进行了更多安装,主要与启动和运行 Steam 和低保真游戏以验证我的系统设置有关,并且在某些时候问题被重新引入我的系统。我安装了开发包./configured,构建并安装了它,现在它可以正常工作了。感谢您的洞察力。此外,当我刚刚运行它时,./configure 脚本中也提到了 Xrandr,所以从技术上讲,我不确定它是否存在我昨天在故障排除时也安装的 Xinerama 或 Xrandr 开发包
  • xrandr 大部分处理视频模式更改和管理,如果您的应用从不更改分辨率/刷新率,您可能会没事。不过很好。您可能还需要 XInput2 开发库,它可以为您提供正确的鼠标捕获和/或相关的鼠标输入。
  • @Teeeeeeeeeeeeeeeeeeeeeeeeeeeej:虽然老实说 16.04 的 repo-provided libsdl2-dev 可能没问题,除非你遇到已经修复的 2.0.4 后的错误,否则不需要从源代码构建以汞为单位。
  • 从源代码编译更多的是为了我的软件开发过程和个人教育,帮助我了解什么是连接/链接的,什么不在我的系统和一般的 linux 中。我想要至少一个不变的 SDL2 2.0.4 源,所以即使 ubuntu 升级了它的开发包,我仍然会拥有我的程序所依赖的版本。我想当我有时间时,我会尝试只使用 libxrandr-dev 安装全新的操作系统和 SDL2 源代码,看看能否重现正确的结果。
猜你喜欢
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 2017-09-11
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 2016-04-25
相关资源
最近更新 更多