系统相关
首页 > 系统相关> > c – Linux中的SDL桌面分辨率检测

c – Linux中的SDL桌面分辨率检测

作者:互联网

参见英文答案 > How can I get the screen resolution using SDL2?                                    1个
我有一些报告说,对于一些Linux用户,特别是那些使用SteamOS的用户,我的游戏分辨率错误.游戏尝试检测当前桌面分辨率并使用该分辨率创建无边框全屏窗口.

例如,SteamOS的分辨率通常为1920×1080,但SDL报告它类似于4096×2160!因此,当游戏开始时,玩家仅看到游戏区域的左下部分.

我检测屏幕分辨率的功能如下:

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计算机都没有问题.我无法在自己的测试环境中重现该问题.

我的问题是:

>这是Linux中SDL实现的问题还是我做错了什么?

而且,如果我确实应该责备这里:

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

解决方法:

SDL_GetDisplayMode的文档有一个启发性的评论:

The display modes are sorted in this priority:

  • width -> largest to smallest
  • height -> largest to smallest

这意味着您实际查询的内容似乎是显示器支持的最大分辨率,而不是实际分辨率.

您可能希望使用SDL_GetCurrentDisplayModeSDL_GetDesktopDisplayMode来获取显示器的当前活动显示模式.

标签:sdl-2,c,linux,screen-resolution
来源: https://codeday.me/bug/20190829/1757878.html