2009-09-17 19 views
9

Larry Osterman'ın debugging a flickering problem in the Windows Vista/7 volume control ile ilgili en son blog gönderisini okudum ve aniden OS X dizüstü bilgisayarımda bir uygulama titreşimi gördüğümü hatırlayamadığımı fark ettim. Aksi halde kötü yazılmış gibi görünen uygulamalarda bile, deneyimimdeki titreme probleminden kaçınılır. Bir Apple vs Windows tartışmaya dönüşmeden (lütfen), neden OS X uygulamaları aynı titrek problemi görünmüyor?Neden OS X, Windows'un yaptığı aynı titrek problemlere sahip değil?

Windows programcıları emerken, Apple geliştiricilerinin, titreşimsiz GUI'leri programlamada sadece şaşırtıcı olduğuna inanıyorum, bu yüzden nedeni nedir? OS X API'sı tüm GUI'lerin çift arabelleğe almayı gerektiriyor mu? Bazı uygulamalar biraz durgun çift tamponlu yeniden boyutlandırma davranışına sahip olsa da, pek çoğu yok ve hala titriyorlar. OS X boyaması, bir şekilde tamamen Windows'dan farklı şekilde akıyor ve WM_ERASEBKGRND sorununu tamamen ortadan kaldırıyor mu? Yoksa göremediğim başka bir ihtimal var mı?

Güncelleme: Yanıtlarınız için teşekkür ederiz. Hem ken hem de cb160'ın cevaplarını seçebilseydim, çünkü ikisi de yardımcı oldular. Mac OS X, double buffered windows ürününe sahiptir.

cevap

9

Hem Windows Vista/7 hem de OSX, ekranda rasterleştirilmiş bitmapler çizmek için birleştirme motorları kullanır. Bu kompozit motorlar tüm pencerelerden çıktıların işlenmesinden ve son ekran görüntüsünün çizilmesinden sorumludur. Bu birleştirme yaklaşımı, OSX'in rıhtıma indirirken genie etkisini nasıl kullanabileceği ve aero'nun yarı saydam sınırları nasıl çizdiği. Ayrıca, ekranın belirli bir alanını dolduran bitmap'in mevcut olmaması gibi titremeyi de önler, boş bir bölge çizmek yerine daha önceden sahip olduğu görüntüyü kullanır.

OSX, ilk gönderiminden bu yana bir bileşim motoru kullanmıştır.O zamanlar, bu kadar çok insan çılgın bir çıtçıt gibiydi, zira o zamandaki tüm video kartları, bitmapler (yani, pencereler düğmeleri ve kenarlıklar) çizmek ve optimize edilmiş görüntüler için optimize edildi. OSX'in sonraki sürümlerinde, kompozisyon, GPU'ya (Quartz Extreme'de) itildi ve böylece CPU'dan önemli bir yük çıkardı ve daha fazla etki yarattı.

Windows compositer yalnızca Windows Vista'da eklendiğinden ve yalnızca bir GPU varsa ve OS'nin doğru sürümüne sahip olduğunuzdan, OSX'teki Quartz Compositer kadar yaygın değil. Kompozitör her zaman Windows'ta kullanılmadığından, bir bölge boşaldığında ve çizimden sorumlu uygulama alanı yeterince hızlı bir şekilde yeniden çizemediğinde titreme meydana gelir.

16

Bunu yapmak için hiçbir şey yapmanız gerekmez. Sahnelerin arkasında.

Siz (hemen hemen her zaman), bir şey değiştiğinde, bir pencere penceresini geçersiz kılmazsanız, açık bir şekilde bir pencereye çizmeyin. Çerçeve daha sonra görüşlerin hiyerarşisine inecek ve pencerenin kirli bölgelerini ikincil bir tampona çekecektir. Daha sonra tamponları değiştirir.

İsteğe bağlı olarak, yeniden çizerken çerçevenin kısayollara girmesine izin veren bazı vaatlerde bulunabilirsiniz, ancak bunların hepsi isteğe bağlıdır. Sadece anlayışlı görüşler etkilenir.

NSView alt sınıfınız YES'i döndürmek için isOpaque yöntemini uygularsa, çerçeve görünümünüzün arkasında hiçbir şeyi temizlemez veya altındaki görünümlerden hiçbirini çekmez.

YES'i döndürmek için preservesContentDuringLiveResize uygulanması, bazı ek sorumluluklar sağlar, ancak pencere yeniden boyutlandırma sırasında performansı artırabilir..10 10.66, bu türden başka iki yeni API, layerContentsRedrawPolicy ve layerContentsPlacement'u ekledi.

Son olarak, özel çizim Windows'a göre daha az yaygındır. Gördüğünüz görüşlerin çoğu çerçeve tarafından sağlanmıştır ve alt sınıflar değildir. Çerçeve tarafından sağlanan araç, optimize edilmiş elmalar anlamına gelir.

1

Yup, hepsi çift yönlü otomatik olarak arabelleğe alınmıştır. Tabii ki, eğer mac os 9'dan eski kodunu çalıştırıyorsanız veya rüzgârdan taşan kod ise, yani 'un muhtemelen üçlü arabelleğini bilmeden tanımlamanızdır. Hey, döngüler ucuz!