【发布时间】:2016-06-09 09:29:48
【问题描述】:
我收到一些报告,对于某些 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 struct 中的信息进入全屏模式。窗口创建和进入全屏是不同的功能,因为使用其他 Linux 发行版而不是 SteamOS 的玩家在游戏过程中也可以选择进入窗口模式:
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 的问题还是我做错了什么?
而且,如果真的是我的错:
- 这是查询屏幕分辨率的正确方法吗?
- 如果不是,我是否应该使用其他方法来查询解析(哪个更可靠)?
【问题讨论】:
-
你的视网膜显示器有问题吗?
-
我发现另一个问题的答案相同How can I get the screen resolution using SDL2?
-
是的,这个问题也有这个问题的答案。唯一的问题是它不处理
SDL_GetDisplayMode、SDL_GetCurrentDisplayMode和SDL_GetDesktopDisplayMode之间的差异。但是,这两个问题的最终结果是相同的。
标签: c++ linux sdl-2 screen-resolution