Aracılığıyla paylaş


Mimari ve bileşenler

Not

Windows 10'daki uygulamalar için DirectComposition yerine Windows.UI.Composition API'lerini kullanmanızı öneririz. Daha fazla bilgi için bkz. Görsel katmanını kullanarak masaüstü uygulamanızı modernleştirme.

Bu konuda, Microsoft DirectComposition'ı oluşturan bileşenler açıklanmaktadır. Aşağıdaki bölümlerden oluşur.

Yazılım bileşenleri

DirectComposition aşağıdaki ana yazılım bileşenlerinden oluşur.

  • Bileşen Nesne Modeli (COM) tabanlı genel API'yi uygulayan kullanıcı modu uygulama kitaplığı (dcomp.dll).
  • Masaüstü Pencere Yöneticisi (DWM) işleminde (dwm.exe) barındırılan ve gerçek masaüstü oluşturma işlemini gerçekleştiren kullanıcı modu oluşturma altyapısı (dwmcore.dll).
  • Uygulamadan oluşturma altyapısına komutları sıralayan çekirdek modu nesne veritabanı (win32k.sysparçası).

Oluşturma altyapısının tek bir örneği, tüm uygulamalar için DirectComposition oluşturma ağaçlarını ve masaüstünün tamamını temsil eden DWM oluşturma ağacını işler. Hem çekirdek modu nesne veritabanı hem de kullanıcı modu oluşturma altyapısı oturum başına bir kez oluşturulur, bu nedenle birden çok kullanıcısı olan bir Terminal Server makinesi bu bileşenlerin birden çok örneğine sahiptir.

Aşağıdaki diyagramda ana DirectComposition bileşenleri ve birbirleriyle ilişkileri gösterilmektedir.

Doğrudan üst düzey mimari

Uygulama kitaplığı

DirectComposition uygulama kitaplığı, dcomp.dll dışarı aktarılan tek bir düz giriş noktası olan ve bir cihaz nesnesine arabirim işaretçisi döndüren genel bir COM tabanlı API'dir. Cihaz nesnesi de, her biri bir arabirim işaretçisi tarafından temsil edilen diğer tüm nesneleri oluşturmaya yönelik yöntemlere sahiptir. Tüm DirectComposition arabirimleri, IUnknown arabirimini devralır ve tam olarak uygular. DirectComposition arabirimlerini kabul eden tüm yöntemler, arabirimin dcomp.dll içinde uygulanıp uygulanmadığını veya başka bir bileşen tarafından uygulanıp uygulanmadığını denetler. DirectComposition genişletilebilir olmadığından, arabirimleri parametre olarak alan yöntemler, arabirimler dcomp.dlliçinde uygulanmazsa E_INVALIDARG döndürür. API özel ayrıcalık gerektirmez; en düşük erişim düzeyinde çalışan işlemler tarafından çağrılabilir. Ancak, API oturum 0'da çalışmadığından hizmetler için uygun değildir. Bu açılardan DirectComposition API'si, en önemlisi Direct2D, Microsoft Direct3D ve Microsoft DirectWrite olmak üzere diğer Microsoft DirectX API'lerine benzer.

Oluşturma altyapısı yalnızca zaman uyumsuz yürütme için tasarlandığından, DirectComposition API'sindeki nesne özellikleri salt okunurdur. Tüm özelliklerin ayarlayıcı yöntemleri vardır, ancak getter yöntemleri yoktur. Okuma özellikleri yalnızca yoğun kaynak kullanımlı olmakla kalmaz, aynı zamanda oluşturma altyapısının döndürdüğü herhangi bir değer hemen geçersiz hale gelebileceğinden de yanlış olabilir. Örneğin, bağımsız bir animasyon okunan özelliğe bağlıysa bu durum oluşabilir.

API iş parçacığı açısından güvenlidir. Bir uygulama herhangi bir zamanda herhangi bir iş parçacığından herhangi bir yöntemi çağırabilir. Ancak, birçok API yönteminin belirli bir sırada çağrılması gerektiğinden, herhangi bir eşitleme olmadan bir uygulama, iş parçacıklarının nasıl bir araya geldiğine bağlı olarak öngörülemeyen davranışlarla karşılaşabilir. Örneğin, iki iş parçacığı aynı nesnenin aynı özelliğini aynı anda farklı değerlere değiştirirse, uygulama iki değerden hangisinin özelliğin son değeri olacağını tahmin edemez. Benzer şekilde, iki iş parçacığı aynı cihazda commitçağırırsa, bir iş parçacığında commit çağrısı yalnızca Commitolarak adlandırılan komutlar değil, her iki iş parçacığı tarafından verilen tüm komutların toplu işlemini göndereceği için iş parçacığı gerçekten işlem davranışına sahip olmaz.

Sistem, cihaz nesnesi başına tüm iç durumu korur. Bir uygulama iki veya daha fazla DirectComposition cihaz nesnesi oluşturursa, uygulama ikisi arasında bağımsız toplu işleri ve diğer durumları koruyabilir.

Tüm DirectComposition nesnelerinin cihaz nesne benzitesi vardır; belirli bir cihaz nesnesi tarafından oluşturulan nesneler yalnızca bu cihaz nesnesiyle kullanılabilir ve yalnızca aynı cihaz nesnesi tarafından oluşturulan diğer nesnelerle ilişkilendirilebilir. Başka bir deyişle, her cihaz nesnesi ayrı ayrı bir işlev adasıdır. Bir özel durum, görselin üst öğesinden farklı bir cihaz nesnesine ait olabileceği görsel ağaçlarının oluşturulmasına izin veren görsel sınıfıdır. Bu, bir uygulamanın ve denetimin tek bir DirectComposition cihaz nesnesini paylaşmaya gerek kalmadan tek bir oluşturma ağacını yönetebildiği senaryoları etkinleştirir.

Kompozisyon altyapısı

DirectComposition oluşturma altyapısı, herhangi bir uygulama işleminden ayrı olarak ayrılmış bir işlem üzerinde çalışır. dwm.exetek bir oluşturma işlemi, bir oturumdaki her uygulamayı destekler. Her uygulama, sahip olduğu her pencere için iki görsel ağaç oluşturabilir. Tüm ağaçlar aslında DWM'nin kompozisyon yapılarını da kapsayan daha büyük bir görsel ağacın alt ağacı olarak uygulanır. DWM, bir oturumdaki her masaüstü için bir büyük görsel ağaç oluşturur. Bu mimarinin başlıca avantajları şunlardır:

  • Oluşturma altyapısı, işlemler arası pencere birlikte çalışabilirliğini ve bileşimini sağlayan tüm uygulama bit eşlemlerine ve görsel ağaçlara erişime sahiptir.
  • Oluşturma altyapısı, herhangi bir uygulama işleminden ayrı olan güvenilir bir sistem işleminde çalışır ve düşük erişim haklarına sahip uygulamaların korumalı içeriği güvenli bir şekilde oluşturmasına olanak tanır.
  • Oluşturma altyapısı belirli bir pencerenin tam olarak ne zaman dolu olduğunu algılayabilir ve pencere için oluşturulan CPU ve grafik işlem birimi (GPU) kaynaklarının israfını önleyebilir.
  • Kompozisyon altyapısı doğrudan ekran arka tamponuna oluşturabilir ve işlem başına kompozisyon altyapıları için gereken fazladan bir kopyaya ihtiyaç duyulmasını önler.
  • Tüm uygulamalar oluşturma için tek bir Direct3D cihazı paylaşır ve bu da önemli ölçüde bellek tasarrufu sağlar

Görsel ağaç, korunan bir yapıdır. DirectComposition API'sinde, atomik olarak işlenen değişiklikler toplu olarak yapıyı düzenleme yöntemleri kullanıma sunar. DirectComposition API'sindeki kök nesne, diğer tüm DirectComposition nesneleri için fabrika görevi üstlenen ve Commitadlı bir yöntem içeren cihaz nesnesidir. Oluşturma altyapısı, uygulama Commitçağırana kadar uygulamanın görsel ağaçta yaptığı değişiklikleri yansıtmaz. Bu noktada, son Commit bu yana yapılan tüm değişiklikler tek bir işlem olarak işlenir.

Commit çağırma gereksinimi bir "çerçeve" kavramına benzer, ancak oluşturma altyapısı zaman uyumsuz olarak çalıştığından, Commitçağrısı arasında birkaç farklı çerçeve sunabilir. DirectComposition'da çerçeve, oluşturma altyapısının tek bir yinelemesidir ve uygulama tarafından Commit'a yapılan iki çağrı arasında harcanan aralık, toplu işolarak adlandırılır.

DirectComposition, DirectComposition API'sine yapılan tüm uygulama çağrılarını toplu olarak oluşturur. win32k.sys oturum sürücüsünde uygulanan çekirdek nesnesi veritabanı, API çağrılarıyla ilişkili tüm durum bilgilerini depolar.

Birleştirme altyapısı, ekrandaki her dikey boş alan için bir çerçeve oluşturur. Çerçeve dikey boşta başlatılır ve sonraki dikey boşluğu hedefler. Çerçeve başlatıldığında, oluşturma altyapısı bekleyen tüm toplu işleri alır ve komutlarını bu çerçeveye ekler. Uygulama Commitçağırdığında ve bekleyen kuyruk çerçevenin başında atomik olarak boşaltıldığında batch'ler beklemedeki bir kuyruğa yerleştirilir. Bu nedenle, bir çerçevenin başlangıcını işaret eden tek bir zaman noktası vardır. Bu noktadan önce gönderilen tüm toplu işler çerçeveye dahil edilirken, sonrasında gönderilen toplu işlemlerin bir sonraki çerçevenin işlenmesini beklemesi gerekir. Tam bileşim döngüsü aşağıdaki gibidir:

  1. Sonraki dikey boşluğun zamanını tahmin edin.
  2. Bekleyen tüm toplu işleri alın.
  3. Alınan toplu işlemleri işleyin.
  4. 1. adımda tahmini zamanı kullanarak tüm animasyonları güncelleştirin.
  5. Ekranın yeniden oluşturulacak bölgelerini belirleyin.
  6. Kirli bölgeleri yeniden oluşturun.
  7. Her ekran için arka ve ön arabellekleri çevirerek çerçeveyi sunun.
  8. 6. ve 7. adımlarda hiçbir şey oluşturulup sunulmadıysa, toplu işlenmeyi bekleyin.
  9. Sonraki dikey boşluğu bekleyin.

Tek bir video bağdaştırıcısına bağlı birden çok monitör varsa, oluşturma altyapısı, oluşturma döngüsünü yönlendirmek ve animasyon örnekleme sürelerini ayarlamak için birincil monitörün dikey boşunu kullanır. Her monitör ayrı bir tam ekran çevirme zinciriyle temsil edilir; oluşturma altyapısı, tek bir Direct3D cihazı kullanarak her monitör için 6. ve 7. adımları hepsini bir kez denemeyle tekrarlar. Birden çok video bağdaştırıcısı da varsa, oluşturma altyapısı 6. ve 7. adımlarda her video bağdaştırıcısı için ayrı bir Direct3D cihazı kullanır.

Aşağıdaki çizimde gösterildiği gibi, oluşturma çerçeveleri her zaman dikey boşta başlayacak şekilde zamanlanmıştır.

birleştirme çerçevesi zamanlama

Kompozisyon ağacı değişmediği için kompozisyon altyapısının yapacak işi yoksa, yeni bir toplu iş beklerken kompozisyon iş parçacığı uyku moduna alır. Yeni bir toplu iş gönderildiğinde, oluşturma iş parçacığı uyanır ancak bir sonraki dikey boş olana kadar hemen uyku moduna geri döner. Bu davranış, uygulamalar ve oluşturma altyapısı için tahmin edilebilir çerçeve başlangıç ve bitiş zamanları sağlar.

Oluşturma altyapısı, çerçeve sunum sürelerini ve geçerli kare hızını yayımlar. Bu bilgilerin yayımlanması, uygulamaların kendi toplu işleri için sunu süresini tahmin etmelerini sağlar ve bu da animasyonların eşitlenmesini sağlar. Özellikle, bir uygulama kendi animasyonları için örnekleme süresini belirlemek üzere, oluşturma altyapısından kare istatistiklerinin bir bileşimini ve ui iş parçacığının bir toplu iş oluşturmak için ne kadar sürdüğünü gösteren geçmiş bir model kullanabilir.

Örneğin, önceki çizimde gösterilen uygulama toplu işleminin başında, uygulama sonraki çerçevenin tam sunu zamanını belirlemek için oluşturma altyapısını sorgulayabilir. Uygulama daha sonra geçerli saati ve oluşturduğu önceki toplu işlerle ilgili bilgileri kullanarak uygulamanın bir sonraki dikey boş işlemden önce geçerli toplu işlemi tamamlayıp tamamlayamayacağını belirleyebilir. Bu nedenle, uygulama kendi animasyonları için örnekleme süresi olarak çerçeve sunu zamanını kullanır. Uygulama, çalışmasını geçerli dikey boşta tamamlama olasılığının düşük olduğunu belirlerse, uygulama bunun yerine sonraki kare süresini örnekleme zamanı olarak kullanabilir ve bu süreyi hesaplamak için oluşturma altyapısı tarafından döndürülen kare hızı bilgilerini kullanabilir.

DirectComposition Kavramları