Linux中的SDL桌面分辨率检测
SDL desktop resolution detection in Linux
我收到一些报告,对于一些Linux用户,尤其是那些使用SteamOS的用户,我的游戏以错误的分辨率打开。游戏试图检测当前的桌面分辨率,并使用该分辨率创建一个无边界全屏窗口。
例如,SteamOS的分辨率通常是1920x1080,但SDL报告它大约是4096x2160!因此,当游戏开始时,玩家只能看到游戏区域的左下部分。
我检测屏幕分辨率的功能如下:
bool View::checkDisplaySize() {
int display_count = 0;
int display_index = 0;
int mode_index = 0;
SDL_DisplayMode mode = { SDL_PIXELFORMAT_UNKNOWN, 0, 0, 0, 0 };
if ((display_count = SDL_GetNumVideoDisplays()) < 1) {
printf("SDL_GetNumVideoDisplays returned: %i", display_count);
return false;
}
if (SDL_GetDisplayMode(display_index, mode_index, &mode) != 0) {
printf("SDL_GetDisplayMode failed: %s", SDL_GetError());
return false;
}
m_display.w = mode.w;
m_display.h = mode.h;
return true;
}
然后,我使用存储在m_display
结构中的信息来进入全屏。窗口创建和全屏是分开的功能,因为使用SteamOS以外的其他Linux发行版的玩家也可以在游戏中选择进入窗口模式:
window = SDL_CreateWindow("Game", 0, 0, m_display.w, m_display.h, window_flags);
SDL_SetWindowBordered(window, SDL_FALSE);
SDL_SetWindowPosition(window, 0, 0);
SDL_SetWindowSize(window, m_display.w, m_display.h);
SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN_DESKTOP);
对我来说,这在我测试过的所有Linux计算机上都没有问题。我还没能在自己的测试环境中重现这个问题。
我的问题是:
- 这是Linux中SDL实现的问题还是我做错了什么
如果真的要怪我的话:
- 这是查询屏幕分辨率的正确方法吗
- 如果没有,我是否应该使用其他方法来查询解析(哪个更可靠)
SDL_GetDisplayMode
的文档中有一句启发性的话:
显示模式按以下优先级排序:
- 宽度->从大到小
- 高度->从最大到最小
这意味着您实际查询的似乎是显示器支持的最大分辨率,而不是实际分辨率。
您可能希望使用SDL_GetCurrentDisplayMode或SDL_GetDesktopDisplayMode来获取显示器的当前活动显示模式。
相关文章:
- 使用CMake检测支持的C++标准
- 当套接字连接断开时检测C/C++Unix
- C/C++预处理器是否可以检测一些编译器选项
- WMI检测进程创建事件-c++
- 基于树莓pi的tensorflow lite量化ssd目标检测
- 下面是我为检测链接列表中的循环而制作的代码
- 落砂模拟碰撞检测C++和SFML
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 为什么C++编译器没有检测到正确声明的类?
- 检测win32服务创建和删除的最佳方法
- 正在LLVM中检测整数比较条件
- 如何在鼠标挂钩过程中检测拖动
- 位移操作和位掩码未检测到重复字符
- 检测 COFF 对象文件中C++内联符号
- qmake:检测目标位宽(32 位或 64 位)
- 增强精神解析器规则以检测语句中的特殊结尾
- 使用分辨率定理用Z3证明
- 如何在 Windows 10 上检测辅助监视器的本机屏幕分辨率或缩放因子
- Linux中的SDL桌面分辨率检测
- 如何在qt中检测屏幕分辨率