C++ Linux下SDL桌面分辨率检测

C++ Linux下SDL桌面分辨率检测,c++,linux,sdl-2,screen-resolution,C++,Linux,Sdl 2,Screen Resolution,我有一些报告说,对于一些Linux用户,特别是那些使用SteamOS的用户,我的游戏以错误的分辨率打开。游戏尝试检测当前桌面分辨率,并使用该分辨率创建无边界全屏窗口 例如,SteamOS的分辨率通常为1920x1080,但SDL报告的分辨率类似于4096x2160!因此,当游戏开始时,玩家只能看到游戏区域的左下部分 我检测屏幕分辨率的功能如下: bool View::checkDisplaySize() { int display_count = 0; int display_i

我有一些报告说,对于一些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;
}

对我来说,这在我测试过的所有Linux计算机上都没有问题。我无法在自己的测试环境中重现这个问题

我的问题是:

  • 这是Linux中SDL实现中的问题还是我做错了什么
如果真的要怪我的话:

  • 这是查询屏幕分辨率的正确方法吗
  • 如果不是,我是否应该使用其他方法来查询分辨率(哪个更可靠)

SDL\u GetDisplayMode的文档中有一句很有启发性的话:

显示模式按此优先级排序:

  • 宽度->从最大到最小
  • 高度->从最大到最小
这意味着您实际查询的似乎是显示器支持的最大分辨率,而不是实际分辨率


您可能需要使用或获取当前显示的活动显示模式。

您可能对视网膜显示有问题吗?我发现另一个问题有相同的答案是的,该问题也有这个问题的答案。唯一的问题是它没有处理
SDL\u GetDisplayMode
SDL\u GetCurrentDisplayMode
SDL\u GetDesktopDisplayMode
之间的差异。然而,这两个问题的最终结果是相同的。
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);