2014-06-22 11 views
5

Muszę jednoznacznie identyfikować wyświetlacz w stopniu, w jakim wyświetlacze są rzeczywiście różne. Zatem te same modele wyświetlaczy, podłączonych do tego samego portu fizycznego, nie będą traktowane jako różne, ale w zasadzie wszystko inne będzie.CGDirectDisplayID, wiele procesorów graficznych, przestarzałe CGDisplayIOServicePort i jednoznacznie identyfikujące wyświetlacze

Gdy zmienia się GPU systemu, CGDirectDisplayID również zmienia się, ale nie w udokumentowany sposób. Eksperymentacja wskazuje, że ten sam identyfikator ekranu będzie się różnić o 2 w zależności od używanego GPU.

CGDisplayID changing issues

sposób na pokonanie tego było uzyskać ciąg rejestru IO na wyświetlaczu:

io_service_t servicePort = CGDisplayIOServicePort (cgDisplayID); 
io_service_t root = IODisplayForFramebuffer (servicePort, kNilOptions); 
NSDictionary* ioRegistryDict = nil; 
NSString*  displayKey = nil; 

IORegistryEntryCreateCFProperties (root, (CFMutableDictionaryRef *)&ioRegistryDict, kCFAllocatorDefault, kNilOptions); 

if (ioRegistryDict) 
    displayKey = [ioRegistryDict objectForKey:@"IODisplayPrefsKey"]; 

Działa to dobrze, z wyjątkiem 10,9, CGDisplayIOServicePort jest przestarzała.

Biorąc to wszystko pod uwagę, a Apple radzi, aby nie buforować NSScreens (które tak naprawdę nie działają w tym celu), jaki jest najlepszy sposób, aby niezawodnie zidentyfikować ekrany, aby móc stwierdzić (na przykład) różnicę między ekran w domu i jeden w pracy?

Nie chcę polegać na rozdzielczości ekranu, ponieważ zmiana rozdzielczości przez użytkownika nie powinna być traktowana jako inny ekran. Nie należy również uważać tego samego ekranu na różnych procesorach graficznych za inny.

Drugorzędnym celem jest znalezienie sposobu na podstawie identyfikatora CGDirectDisplay, jak ustalić, jaki byłby CGDirectDisplayID dla tego samego ekranu, gdyby nastąpiło przełączenie GPU? Pozwoli mi to przynajmniej śledzić wyświetlacze według CGDirectDisplayID, o ile mogę dopasować dwa wyniki z dwóch kontrolerów GPU.

+0

Nie jestem do końca pewien, jakie właściwości wyświetlacza chcesz wpłynąć na pojęcie "ten sam" kontra "inny", ale powinieneś spojrzeć na funkcje Quartz Display Services, takie jak 'CGDisplayModelNumber()', 'CGDisplaySerialNumber() ',' CGDisplayUnitNumber() 'i' CGDisplayVendorNumber() '. –

+0

The Quartz Reference stwierdza, że ​​"Przy przypisywaniu identyfikatora wyświetlania, Quartz bierze pod uwagę następujące parametry: Dostawca, Model, Numer Seryjny i Pozycja w rejestrze I/O Kit" Po uruchomieniu MBP na zintegrowanym GPU otrzymuję: displayID : 2077805631. Na szybkim GPU (AMD Radeon) otrzymuję displayID: 69678016. W obu przypadkach sprzedawca, model, s/n i urządzenie są takie same: 1552, 40143, 0, 0. Więc co jeszcze robi Apple, powoduje to Identyfikatory są różne? – Trygve

+0

Nie wiem. Wątpię, czy ta lista miała być wyczerpująca. Ale dlaczego cię to obchodzi? Myślałem, że szukasz sposobu na zidentyfikowanie wyświetlacza, który * nie * zmienił się z GPU. –

Odpowiedz

0

Zastosowanie CFUUIDRef które można uzyskać za pomocą CGDisplayCreateUUIDFromDisplayID (CGDirectDisplayID displayID), można uzyskać korzystając z powrotem UUID CGDisplayGetDisplayIDFromUUID (CFUUIDRef UUID)

To co używam do jednoznacznej identyfikacji wyświetlaczy nawet gdy ich zmiany CGDirectDisplayID . Te funkcje nie są poprawnie udokumentowane przez firmę Apple, ale moje testy na wielu komputerach Mac z wieloma wyświetlaczami wykazały, że uzyskany wynik CFUUIDRef jest unikalny i spójny, nawet jeśli CGDirectDisplayID zmienia się z jakiegokolwiek powodu.

Te wywołania interfejsu API są dostępne w ApplicationUsługach w wersjach 10.7-10.12, a ColorSync od wersji 10.13.

Powiązane problemy