【发布时间】: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);。