【问题标题】:SDL Detect High DPI/Retina DisplaySDL 检测高 DPI/Retina 显示屏
【发布时间】:2019-11-08 01:29:06
【问题描述】:

我想知道检测高 DPI 显示器的最佳方法是什么。目前我正在尝试使用SDL_GetDisplayDPI (int, *float, *float, *float),但这仅在我测试的两台不同计算机上返回错误(运行 OS X 10.11.5 的 MacBook Pro 和运行 macOS 10.12 Beta (16A238m) 的 iMac)。作为参考,我的代码如下。

float diagDPI = -1;
float horiDPI = -1;
float vertDPI = -1;

int dpiReturn = SDL_GetDisplayDPI (0, &diagDPI, &horiDPI, &vertDPI);
std::cout << "GetDisplayDPI() returned " << dpiReturn << std::endl;

if (dpiReturn != 0)
{

    std::cout << "Error: " << SDL_GetError () << std::endl;
}

std::cout << "DDPI: " << diagDPI << std::endl << "HDPI: " << horiDPI << std::endl << "VDPI: " << vertDPI << std::endl;

不幸的是,这只是给我这样的东西:

/* Output */
GetDisplayDPI() returned -1
Error: 
DDPI: -1
HDPI: -1
VDPI: -1
Not Retina

我还尝试将 OpenGL 可绘制大小与 SDL 窗口大小进行比较,但 SDL_GetWindowSize (SDL_Window, *int, *int) 也返回 0。该代码如下,然后是输出。

int gl_w;
int gl_h;

SDL_GL_GetDrawableSize (window, &gl_w, &gl_h);
std::cout << "GL_W: " << gl_w << std::endl << "GL_H: " << gl_h << std::endl;


int sdl_w;
int sdl_h;

SDL_GetWindowSize (window, &sdl_w, &sdl_h);
std::cout << "SDL_W: " << sdl_w << std::endl << "SDL_H: " << sdl_h << std::endl;

/* Output */
GL_W: 1280
GL_H: 720
SDL_W: 0
SDL_H: 0

完全有可能我在这里做错了什么,或者在错误的地方打了这些电话,但我认为更有可能是我完全走错了路。有一个禁止高 dpi 画布的提示,所以某处可能有一个简单的布尔值,或者我缺少的东西。我当然已经浏览了 wiki,并检查了谷歌,但我真的找不到任何帮助。欢迎任何建议或反馈!

感谢您的宝贵时间!

【问题讨论】:

  • 你的代码对我有用(在我添加了相关的初始化代码之后)。您能否发布一个重现错误的最小、完整(可编译)示例?
  • 感谢您对此进行测试,@Galik!我很高兴提供一个指向我的项目的链接,但是我使用的是第 3 方 GUI 工具包,所以它可能有点令人困惑。不过,只要您安装了 SDL2、SDL2_Image 和 SDL2_TTF,它就应该毫无问题地构建和运行。该项目可以在这里找到:github.com/2CatStudios/LightYear/tree/retina-support/Project/… 相关代码在 RenderingManager.cpp 第 14 行 github.com/2CatStudios/LightYear/blob/retina-support/Project/…
  • @Galik 你用的是什么操作系统?我想这可能是 SDL_GetDisplayDPI 函数的 Cocoa 实现的问题。
  • 你有没有调用过库初始化函数:SDL_Init(SDL_INIT_VIDEO);?
  • 在 Kiss_draw.c (github.com/2CatStudios/LightYear/blob/retina-support/Project/…) 中,在第 200 行调用了 SDL_Init(SDL_INIT_EVERYTHING);

标签: c++ sdl-2


【解决方案1】:

我知道我没有直接回答您的问题,并且想重申您尝试过的一件事。

在 Macbook pro 上,当 SDL 窗口位于外部显示器上时,SDL_GetWindowSizeSDL_GL_GetDrawableSize 返回相同的值。如果窗口在 Retina 屏幕上,它们是不同的。具体来说,每个维度的可绘制尺寸都大 2 倍。

【讨论】:

    【解决方案2】:

    遇到此问题时,我正在使用 SDL 的 .framework 安装。出于一个不相关的原因,我删除了 .framework SDL 文件(图像和 ttf 也是如此),并从源代码构建了 SDL(从而过渡到“unix 风格”的 SDL 安装)。令我惊讶的是,SDL_GetDisplayDPI () 现在返回 0,在非视网膜 iMac 上将 DDPI、HDPI 和 VDPI 的值设置为 109,在视网膜 MacBook Pro 上设置为 113.5。我不确定这些是否正确/准确,但在发布之间是一致的,所以我会使用它。

    此时,我不确定这是否是已在 repo 中修复的错误,或者是我的 .framework 文件的问题。在一个有点不相关的注释中,SDL_GetBasePath ()SDL_GetPrefPath (),它们也不起作用,现在返回预期值。如果您在 macOS 上也遇到任何这些问题,请尝试从源代码 (https://hg.libsdl.org/SDL) 编译和安装 SDL。

    谢谢大家的意见!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      相关资源
      最近更新 更多