我有一些报告称,对于某些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
结构中的信息进入全屏。窗口创建和全屏是单独的功能,因为使用其他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计算机都没有问题。我还没有能够在我自己的测试环境中重现这个问题。
我的问题是:
而且,如果我确实应该责备这一点:
答案 0 :(得分:5)
SDL_GetDisplayMode
的文档有一个启发性的评论:
显示模式按此优先级排序:
- 宽度 - &gt;从最小到最小
- 身高 - &gt;从最小到最小
- ...
这意味着您实际查询的内容似乎是显示器支持的最大分辨率,而不是实际分辨率。
您可能希望使用SDL_GetCurrentDisplayMode或SDL_GetDesktopDisplayMode来获取显示的当前活动显示模式。