2011-08-13 18 views
9

Her şeyden önce, bu konunun daha önce birkaç kez gündeme getirildiğini biliyorum, ancak bu soruyu gönderiyorum çünkü geçmişte kullandığım "çözümler" in hiçbiri bu konuda işe yaramadı. vaka. NSToolbar'ımın bir görünümünde barındırılan bir CALayer'a biraz metin çiziyorum. Aşağıda metin bakmak seviyor ne:Temel Animasyonla Kötü Metin Oluşturma

Font smoothing on

Ben bağlam içine çizim önce altpiksel düzgünleştirme kapatmak için CGContextSetShouldSmoothFonts(ctx, false) çağırmaktır this StackOverflow yazı, gelen bir öneri kullanarak çalıştı. Bu geçmişte bana kabul edilebilir sonuçlar vermiş bir çözümdür, ama durumda metin daha da kötü görünmesine neden gibi görünüyor:

Font smoothing off

söz konusu yayında belirtilen diğer çözüm rect doldurmaktır çizimden önce opak bir arka plan rengiyle, bu durumda araç çubuğu arka planı bir degrade olduğu için mümkün değildir. Bu metni düz NSView içine çizilen metin kadar güzel yapmak için yapabileceğim bir şey var mı?

+1

CA'nın subpixel antialiasing olmadan oluşturduğuna inanıyorum çünkü katmanların ekran pikselleriyle hizalanmasını bilmiyor. Ancak çoğu durumda, katman tam olarak hizalanmış ve böylece subpixel antialiasing uygun olacaktır. Daha önce hiç bu kadar somut bir çözüm bulamadım - büyük bir yanıt aldığımız umuduyla +1… :) – jtbandes

+0

Ayrıca: ilk ekran görüntüsünde sorun nedir? İstediğiniz sonuç nedir? – jtbandes

+0

Kelimeleri açıklamak zor ama metin biraz keskin/net görünüyor. Neredeyse tırtıklı görünüyor. Bu küçük bir ekran görüntüsünden görmek zor, ama uygulamanın geri kalanı ile karşılaştırıldığında genel resmi gördüğünüzde oldukça açık – indragie

cevap

5

Maalesef sihir düzeltmesi yok. Günün sonunda, no'lu metin, no'lu SPAA almak için opak bir arka plan üzerine çizilmelidir. Bu berbat, ama katmanların nasıl çalıştığı konusunda çok mantıklı. Ve dürüst olmak gerekirse, Apple'ın bunu "düzeltmesi" ni göremiyorum. Sanırım bu, eski yazılım oluşturma modeliyle uzun süre kalmış olmalarının sebebi. Bu zor bir problem ve yüksek DPI'ye geçerek bunu görmezden gelmeyi umuyorlar. Her durumda, özel durumda SPAA almak için birkaç yol vardır.

Degradeyi yeniden oluşturmayı ve metninizi çizerken kendiniz çizmeyi deneyebilirsiniz. Ancak araç çubuğu gradyanı bir işletim sistemi güncellemesinde değişiyorsa ve kırınımın tam olarak eşleşmesi zor olabiliyorsa, bu kesinlikle kırılgandır. Ya da çalışma zamanında veya zamanın önünde araç çubuğu arkaplanının bir görüntüsünü yakalamaya çalışabilir ve arka plan olarak çizebilirsin.

+0

Son öneri, iyi bir şey gibi görünüyor. Bunu deneyeceğim ve bunun nasıl çalıştığını anlatayım. – indragie

+0

Sadece gradyanı yeniden oluşturdum ve daha sonra bunu çizdim, mükemmel çalışıyor. Söylediğiniz gibi, bir işletim sistemi revizyonunda değişebilir ama sanırım o olaya hazırlanmak için zamanım olacak ;-). Bu cevabı doğru olarak işaretliyorum çünkü aslında bu yöntemle çalışmayı başardım, ancak Rob'un cevabı da fantastik bir teknik açıklama sağlıyor. – indragie

7

Alt piksel antialiasing yapmanın mümkün olmaması, sahnelerin arkasındaki CALayers aslında sadece OpenGL dokularıdır.

Bu, GPU tarafından doğrudan işlenen ve işlenen bitmapler oldukları anlamına gelir. GPU metin hakkında hiçbir şey bilmiyor ve bu yüzden alt piksel antialiasing uygulayamıyor.

Alt piksel antialiasing işlemek için, katman her değiştirildiği zaman katman içeriğinin piksel değerlerini yeniden hesaplamak zorunda kalacaktı; bu, pahalıya mal olacak ve katmanı GPU'ya barındıran tüm noktayı kaldıracak, Bu, birleştirme ve son derece hızlı oluşturma yapmaktır.

Opak arka planlar üzerindeki metnin SPAA'yı kullanabilmesinin nedeni, katmanın dokümanın GPU'da saklanmasından önce metnin alt piksel yumuşatma ile önceden oluşturulmuş olmasıdır. Metnin arka planı şeffaf ise bu mümkün değildir.

Bu sınırlama ile yaşamak zorunda kalacaksınız. Neyse ki, artık hepimiz HiDPI ekranlar elde ettiğimizde artık bir sorun olmayacak… iPhone'a, alt piksel antialiasing yapmayan bir göz atın. IPhone'da, metin yüksek ekran çözünürlüğü sayesinde iyi görünüyor.

+0

Ama hangi noktada metin (örneğin, 'CATextLayer') render edilir? Subpixel antialiasing ile oluşturulmasına neden olacak basit bir yol yok mu, bildiğiniz sürece her zaman ekran pikselleriyle hizalanacak mı? – jtbandes

+0

Metin, her değiştiğinde oluşturulur ve temel olarak OpenGL desteğinin arkasına bir bitmap olarak yazılır. Eğer SPAA'nın hesaplamak mümkün olabileceği, ancak ne yazık ki böyle bir durumun söz konusu olmadığı durumlarda, bunun harika olacağını kabul ediyorum. Değiştirmek isterseniz bir hata raporu gönderin… –

+0

Ama bu bir çeşittir. Düz bir arka plana sahip bir metin alanınız (etiket) varsa, ana görünümü katman destekli olsa bile, SPAA kullanıyor gibi görünüyor. Bu ne yapar? – jtbandes

0

OpenGL, animasyon, gerçek zamanlı kaydırma metni, çok örnekli AA kullanarak dokularda metin oluşturma konusunda iyi bir deneyime sahibim.Alfa ile 4 baytlık bir doku, arka planın umurunda değil ya da şeffaf değil. OpenGL bu saydam dokuyu gerçek zamanda işler. Ve gliflerin herhangi küçük bir değişiminde bir dokunun yeniden yapılması, bir mikrosaniye meselesidir. Apple bunu düzeltebilir.

İlgili konular