2014-06-22 7 views
5

Ekranları gerçekten karakteristik olarak farklı olacak şekilde benzersiz bir şekilde tanımlamam gerekir. Böylelikle, aynı fiziksel bağlantı noktasına takılan aynı ekran modelleri, farklı olarak ele alınmazdı, ama temel olarak her şey olurdu.CGDirectDisplayID, birden çok GPU, CGDisplayIOServicePort'u kullanımdan kaldırdı ve ekranları benzersiz bir şekilde tanımladı

Sistem GPU değiştiğinde, CGDirectDisplayID de değişir, ancak belgelenmiş bir şekilde değil. Deneme, hangi ekran kartının kullanıldığına bağlı olarak aynı ekran kimliğinin 2'ye göre farklılık göstereceğini gösterir.

CGDisplayID changing issues

bu aşmak için bir yolu

gösterilmesi için bir IO kayıt dize almak için olmuştur: Bu 10.9 haricinde iyi çalışıyor

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"]; 

, CGDisplayIOServicePort kullanımdan kaldırılmıştır.

Tüm bunlar göz önünde bulundurulduğunda ve Apple'ın NSScreens'ı önbelleğe almama tavsiyesi (gerçekten bu amaç için işe yaramıyor), ekranları güvenilir şekilde tanımlamanın en iyi yolu nedir? evde bir ekran ve bir işte?

Kullanıcı çözünürlüğünü farklı bir ekran olarak kabul edilmemesi gerektiğinden, ekran çözünürlüğüne güvenmek istemiyorum. Farklı GPU'lardaki aynı ekran farklı kabul edilmemelidir.

İkincil amaç, bir CGDirectDisplayID verilen bir yol bulmaktır, bir GPU anahtarı oluşması durumunda aynı ekran için CGDirectDisplayID'nin ne olacağını nasıl belirleyebilirim? Bu, en az iki GPU denetleyicisinden iki sonuç alabildiğim sürece CGDirectDisplayID tarafından ekranları izlememe izin verir. CGDisplayCreateUUIDFromDisplayID (CGDirectDisplayID displayID) kullanılarak elde edilebilir ve geri CGDisplayGetDisplayIDFromUUID (CFUUIDRef uuid) kullanılarak UUID alabilirsiniz

+0

Bir ekranın özelliklerinin "aynı" ve "farklı" kavramlarını etkilemek istediğinizden tam olarak emin değilim, ancak CGDisplayModelNumber(), CGDisplaySerialNumber gibi Quartz Display Services işlevlerine bakmalısınız.() ',' CGDisplayUnitNumber() 've' CGDisplayVendorNumber() '. –

+0

Quartz Reference, "Bir display ID atarken, Quartz aşağıdaki parametreleri göz önünde bulundurur: I/O Kit kayıt defterinde Satıcı, Model, Seri Numarası ve Konum" Tümleşik GPU'yu MBP'de çalıştırdığımda şunu elde ederim: displayID : 2077805631. Hızlı GPU'da (AMD Radeon) bir displayID alıyorum: 69678016. Her iki durumda da satıcı, model, s/n ve ünite aynı: 1552, 40143, 0, 0. Peki Apple'ın yaptığı başka bir şey buna sebep oluyor. Kimlikler farklı mı? – Trygve

+0

Bilmiyorum. Bu listenin kapsamlı olması gerektiğinden şüpheliyim. Ama neden umursuyorsun? GPU ile * değişmeyen bir ekranı tanımlamanın bir yolunu aradığınızı sanıyordum. –

cevap

0

Kullanım CFUUIDRef

Bu benim benzersiz bile onların CGDirectDisplayID değişiklikleri görüntüler tanımlamak için kullanıyorum budur . Bu işlevler maalesef Apple tarafından düzgün bir şekilde belgelenmiyor, ancak çoklu ekranlarda birden fazla Mac üzerinde yaptığım testler, CFUUIDRef'in, CGDirectDisplayID her ne sebeple olursa olsun, benzersiz ve tutarlı olduğunu gösterdi.

Bu API çağrıları, 10.7 - 10.12'de ApplicationServices ve 10.13'den beri ColorSync'te kullanılabilir.

İlgili konular