SDL 检测高 DPI/Retina 显示
SDL Detect High DPI/Retina Display
我想知道检测高 DPI 显示器的最佳方法是什么。目前我正在尝试使用 SDL_GetDisplayDPI (int, *float, *float, *float)
,但是这只在我测试过的两台不同的计算机上返回了错误(MacBook Pro 运行 OS X 10.11.5 和 iMac 运行 macOS 10.12 测试版 (16A238m))。作为参考,我的代码如下。
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 window 大小进行比较,但 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 画布的提示,因此某处可能有一个简单的 bool,或者我缺少的东西。我确实浏览了 wiki,并检查了 Google,但我真的找不到任何帮助。欢迎任何建议或反馈!
感谢您的宝贵时间!
遇到此问题时,我正在使用 SDL 的 .framework 安装。出于一个不相关的原因,我丢弃了 .framework SDL 文件(还有图像和 ttf),并从源代码构建了 SDL(从而过渡到 "unix-style" SDL 安装)。令我惊讶的是,SDL_GetDisplayDPI ()
现在 returning 0,将 DDPI、HDPI 和 VDPI 的值在非视网膜 iMac 上设置为 109,在视网膜 MacBook Pro 上设置为 113.5。我不确定这些是 correct/accurate,但它在发布之间是一致的,所以我会使用它。
在这一点上,我不确定这是一个错误(已在存储库中修复),还是我的 .framework 文件有问题。在有点不相关的说明中,SDL_GetBasePath ()
和 SDL_GetPrefPath ()
也不起作用,现在 return 是预期值。如果您在 macOS 上也遇到任何这些问题,请尝试从源代码编译和安装 SDL (https://hg.libsdl.org/SDL)。
感谢大家的参与!
我知道我没有直接回答你的问题,我想重申你尝试过的一件事。
在 Macbook pro 上,当 SDL window 在外部显示器上时,SDL_GetWindowSize
和 SDL_GL_GetDrawableSize
return 相同的值。如果 window 在 Retina 屏幕上,它们是不同的。具体来说,drawable 大小在每个维度上都大 2 倍。
我想知道检测高 DPI 显示器的最佳方法是什么。目前我正在尝试使用 SDL_GetDisplayDPI (int, *float, *float, *float)
,但是这只在我测试过的两台不同的计算机上返回了错误(MacBook Pro 运行 OS X 10.11.5 和 iMac 运行 macOS 10.12 测试版 (16A238m))。作为参考,我的代码如下。
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 window 大小进行比较,但 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 画布的提示,因此某处可能有一个简单的 bool,或者我缺少的东西。我确实浏览了 wiki,并检查了 Google,但我真的找不到任何帮助。欢迎任何建议或反馈!
感谢您的宝贵时间!
遇到此问题时,我正在使用 SDL 的 .framework 安装。出于一个不相关的原因,我丢弃了 .framework SDL 文件(还有图像和 ttf),并从源代码构建了 SDL(从而过渡到 "unix-style" SDL 安装)。令我惊讶的是,SDL_GetDisplayDPI ()
现在 returning 0,将 DDPI、HDPI 和 VDPI 的值在非视网膜 iMac 上设置为 109,在视网膜 MacBook Pro 上设置为 113.5。我不确定这些是 correct/accurate,但它在发布之间是一致的,所以我会使用它。
在这一点上,我不确定这是一个错误(已在存储库中修复),还是我的 .framework 文件有问题。在有点不相关的说明中,SDL_GetBasePath ()
和 SDL_GetPrefPath ()
也不起作用,现在 return 是预期值。如果您在 macOS 上也遇到任何这些问题,请尝试从源代码编译和安装 SDL (https://hg.libsdl.org/SDL)。
感谢大家的参与!
我知道我没有直接回答你的问题,我想重申你尝试过的一件事。
在 Macbook pro 上,当 SDL window 在外部显示器上时,SDL_GetWindowSize
和 SDL_GL_GetDrawableSize
return 相同的值。如果 window 在 Retina 屏幕上,它们是不同的。具体来说,drawable 大小在每个维度上都大 2 倍。