SDL检测高DPI /视网膜显示

时间:2016-07-13 18:27:27

标签: c++ sdl-2

我想知道检测高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的画布,所以可能在某个地方有一个简单的bool,或者我缺少的东西。我当然已经浏览了维基,并检查了谷歌,但我真的找不到任何帮助。欢迎任何建议或反馈!

感谢您的时间!

2 个答案:

答案 0 :(得分:0)

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

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

感谢大家的投入!

答案 1 :(得分:0)

我知道我不是直接回答您的问题,而是想重申您尝试过的一件事。

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