NSScreenNumber изменяется (случайно)? - PullRequest
5 голосов
/ 29 декабря 2011

В моем приложении мне нужно различать разные дисплеи, что я делаю, используя ключ NSScreenNumber в словаре deviceDescription, предоставленном NSScreen. До сих пор все работало безупречно, но теперь внезапно я иногда получаю другой идентификатор экрана для моего основного экрана (это ноутбук, и я не подключал второй экран в течение нескольких месяцев, это всегда одно и то же оборудование). Идентификатор раньше был 69676672, но сейчас большую часть времени я получаю 2077806975.

Сначала я подумал, что могу как-то неправильно истолковать NSNumber, но, похоже, это не так, я также проверил, используя функцию CGMainDisplayID (), и получил то же значение. Что еще более странно, так это то, что некоторые приложения Apple все еще имеют старый идентификатор: например, ссылка на изображение рабочего стола в его конфигурационном файле с использованием идентификатора экрана, а при обновлении образа рабочего стола приложение Apple для изображений рабочего стола использует «правильный» (= старый) идентификатор.

Я начинаю задаваться вопросом, могло ли быть изменение в недавнем обновлении (10.7.1 или 10.7.2), которое привело к изменению, кто-нибудь еще заметил что-то подобное или была эта проблема раньше?

Вот код, который я использую:

 // This is in an NSScreen category
 - (NSNumber *) uniqueScreenID {
     return [[self deviceDescription] objectForKey:@"NSScreenNumber"];
 }

А для получения int:

 // Assuming screen points to an instance of NSScreen
 NSLog(@"Screen ID: %i", [[screen uniqueScreenID] intValue]);

Это начинает расстраивать, ценю любую помощь / идеи, спасибо!

1 Ответ

3 голосов
/ 24 июля 2012

Для компьютеров Mac со встроенной графикой и дискретными графическими картами (например, модели MacBook Pro со встроенной графикой Intel и отдельной видеокартой) идентификатор дисплея может измениться, когда система автоматически переключается между ними. Вы можете отключить «Автоматическое переключение графики» на панели настроек Energy Saver, чтобы проверить, является ли это причиной изменения номера экрана (если этот параметр отключен, всегда будет использоваться дискретная видеокарта).

В таких системах выбор графики, используемой в конкретное время, зависит от приложений, которые в данный момент работают, и их потребностей. Я считаю, что любое использование OpenGL приложением может привести к переключению, например, на дискретную видеокарту.

Если вам нужно заметить, когда происходит такое переключение во время работы вашего приложения, вы можете зарегистрировать обратный вызов (CGDisplayRegisterReconfigurationCallback) и изучить происходящие изменения (kCGDisplayAddFlag, kCGDisplayRemoveFlag и т. Д.). Если вы пытаетесь сопоставить отображение с ранее использованным / обнаруженным, вам нужно пойти дальше простого сравнения идентификаторов дисплея.

...