SDL 检测高 DPI/视网膜显示器
SDL Detect High DPI/Retina Display
我想知道检测高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画布,所以可能在某处有一个简单的布尔值,或者我缺少的东西。我当然浏览了维基,并检查了谷歌,但我真的找不到任何帮助。欢迎任何建议或反馈!
谢谢你的时间!
我不是在直接回答你的问题,我想重申你尝试过的一件事。
在 Macbook Pro 上,当 SDL 窗口位于外部显示器上时,SDL_GetWindowSize
和 SDL_GL_GetDrawableSize
返回相同的值。如果窗口位于 Retina 屏幕上,则它们会有所不同。具体来说,每个维度的可绘制对象大小要大 2 倍。
遇到此问题时,我正在使用 SDL 的 .framework 安装。出于一个不相关的原因,我丢弃了 .framework SDL 文件(图像和 ttf),并从源代码构建了 SDL(从而过渡到"unix 风格"的 SDL 安装)。令我惊讶的是,SDL_GetDisplayDPI ()
现在返回 0,将 DDPI、HDPI 和 VDPI 的值设置为 109,在非视网膜 MacBook Pro 上设置为 113.5。我不确定这些是否正确/准确,但它在发布之间是一致的,所以我会使用它。
在这一点上,我不确定这是一个错误,该错误已在存储库中修复,还是我的 .framework 文件存在问题。有点不相关的说明是,同样不起作用的SDL_GetBasePath ()
和SDL_GetPrefPath ()
现在返回预期值。如果您在 macOS 上也遇到这些问题,请尝试从源代码编译和安装 SDL(https://hg.libsdl.org/SDL)。
谢谢大家的投入!
- 如何在qt中同步应用程序和显示器的刷新率?
- C++列出屏幕以在第二台显示器中显示图像
- 使用多个显示器 - XOpenDisplay(NULL) 有时无法获取窗口的当前显示吗?
- 自由过剩(某些东西):无法打开显示器
- 管理多个显示器
- 为什么我的串行串行在Arduino IDE上通过串行显示器进行两次打印
- 如何使用OpenCV在不同的显示器中显示不同的窗口
- 获取有关 X11 中离鼠标光标最近的显示器的信息
- 显示器在 Ubuntu 上使用 OpenGL 闪烁
- 如何在液晶显示器上显示粗体字
- 如何处理 KDE5 等离子体中第二个显示器的连接
- 如何拆分在多个8位显示器上显示的值
- Allegro 5:在大分辨率显示器中处理小精灵尺寸
- 如何在2D中构建显示器
- 如何区分外接显示器和笔记本电脑屏幕本身?
- 使用不同的显示器打开
- 窗口多个显示器位置
- 多显示器环境中的鼠标换行
- 如何使用Qt/C++和各种显示器拍摄打印屏幕
- SDL 检测高 DPI/视网膜显示器