2016-07-13 2 views
0

Мне интересно, какой лучший способ обнаружить высокий дисплей DPI. В настоящее время я пытаюсь использовать SDL_GetDisplayDPI (int, *float, *float, *float), однако это только возвратило ошибки на двух разных компьютерах, с которыми я тестировался (MacBook Pro с ОС OS X 10.11.5 и iMac, работающий с MacOS 10.12 Beta (16A238m)). Для справки, мой код ниже.SDL Detect High DPI/Retina Display

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_GetWindowSize (SDL_Window, *int, *int) возвращается 0s, тоже. Этот код ниже, а затем выход.

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 

Вполне возможно, что я делаю что-то здесь не так, или что делает эти вызовы в неправильном месте, но я думаю, что более вероятно, что я на ложном пути полностью. Есть подсказка, чтобы запретить холсты с высоким разрешением, так что, возможно, где-то есть простой bool или что-то, что мне не хватает. Я, конечно, просмотрел вики и проверил Google, но я не могу найти никакой помощи для этого. Любые предложения или отзывы приветствуются!

Благодарим вас за внимание!

+1

Ваш код работает для меня (после того, как я добавил соответствующий код инициализации). Можете ли вы опубликовать минимальный, полный (компилируемый) пример, который воспроизводит ошибку? – Galik

+0

Спасибо, что проверили это, @Galik! Я рад предоставить ссылку на мой проект, однако я использую инструментарий стороннего GUI, поэтому может быть немного запутанным. Он должен строить и запускаться без проблем, хотя, если у вас установлены SDL2, SDL2_Image и SDL2_TTF. Проект можно найти здесь: https://github.com/2CatStudios/LightYear/tree/retina-support/Project/Universal/LightYear Соответствующий код находится в RenderingManager.cpp по строке 14 https://github.com/2CatStudios /LightYear/blob/retina-support/Project/Universal/LightYear/src/RenderingManager.cpp –

+0

@Galik Какая ОС вы используете? Полагаю, возможно, что это проблема с реализацией Cocoa функции 'SDL_GetDisplayDPI'. –

ответ

0

Я использовал установку SDL для SDL, когда столкнулся с этой проблемой. По непонятной причине я повредил файлы SDK .framework (изображение и ttf), а также построил SDL из исходного кода (таким образом, перешел на SDL-установку в стиле unix). К моему удивлению, SDL_GetDisplayDPI() теперь возвращает 0, устанавливая значения DDPI, HDPI и VDPI, до 109 на не-сетчатке iMac и 113,5 на сетчатке MacBook Pro. Я не уверен, что они правильные/точные, но это согласуется между запусками, поэтому я буду работать с ним.

На данный момент я не уверен, что это ошибка, которая была исправлена ​​в репо или была проблема с моими файлами .framework. На несколько несвязанных примечаниях SDL_GetBasePath() и SDL_GetPrefPath(), которые также не работали, теперь возвращают ожидаемые значения. Если вы также испытываете какие-либо из этих проблем на macOS, попробуйте выполнить компиляцию и установку SDL из источника (https://hg.libsdl.org/SDL).

Спасибо за ваш вклад, все!