2011-08-13 21 views
9

के साथ खराब पाठ प्रतिपादन सबसे पहले, मुझे पता है कि यह विषय कई बार पहले लाया गया है लेकिन मैं इस प्रश्न को पोस्ट कर रहा हूं क्योंकि मैंने पहले से उपयोग किए गए "समाधान" में से कोई भी इस विशिष्ट कार्य में काम नहीं किया है मामला। मैं कुछ पाठ CALayer पर खींच रहा हूं जो मेरे एनएसटीूलबार के अंदर एक दृश्य द्वारा होस्ट किया गया है। यहाँ पाठ देखो पसंद करती है:कोर एनीमेशन

Font smoothing on

मैं this StackOverflow पोस्ट, संदर्भ में ड्राइंग से पहले उपपिक्सेल एंटीलायज़िंग़ बंद करने के लिए CGContextSetShouldSmoothFonts(ctx, false) कॉल करने के लिए है, जो एक सुझाव उपयोग करने की कोशिश। यह एक समाधान है कि अतीत में मुझे दिया है स्वीकार्य परिणाम है, लेकिन इस मामले में यह पाठ भी बदतर लग बना दिया है लगता है:

Font smoothing off

अन्य समाधान है कि पोस्ट में उल्लेख किया रेक्ट को भरने के लिए है ड्राइंग से पहले एक अपारदर्शी पृष्ठभूमि रंग के साथ, जो इस मामले में बस संभव नहीं है क्योंकि टूलबार पृष्ठभूमि एक ढाल है। क्या इस पाठ को सादे NSView में खींचे गए पाठ के रूप में अच्छा बनाने के लिए मैं कुछ भी कर सकता हूं?

+1

मेरा मानना ​​है कि सीए उप-पिक्सेल एंटीअलाइजिंग के बिना प्रस्तुत करता है क्योंकि यह स्क्रीन पिक्सल के साथ परत के संरेखण को नहीं जानता है। लेकिन कई मामलों में, परत बिल्कुल गठबंधन है और इसलिए उप-पिक्सेल एंटीअलाइजिंग उपयुक्त होगी। मुझे अभी तक एक ठोस समाधान नहीं मिला है - आशा है कि हमें एक अच्छा जवाब मिलेगा :) – jtbandes

+0

इसके अलावा: आपके द्वारा पोस्ट किए गए पहले स्क्रीनशॉट में क्या गलत है? आपका वांछित परिणाम क्या है? – jtbandes

+0

शब्दों में व्याख्या करना मुश्किल है, लेकिन पाठ बस थोड़ा तेज/कुरकुरा दिखता है। यह लगभग जंजीर दिखता है। उस छोटे स्क्रीनशॉट से देखना मुश्किल है, लेकिन एक बार जब आप ऐप के बाकी हिस्सों की तुलना में समग्र तस्वीर देखते हैं तो यह हाल ही में स्पष्ट है – indragie

उत्तर

5

दुर्भाग्य से कोई जादू तय नहीं है। दिन के अंत में, पाठ SPA प्राप्त करने के लिए एक अपारदर्शी पृष्ठभूमि पर खींचा जाना चाहिए। यह बेकार है, लेकिन यह बहुत समझ में आता है कि परतें कैसे काम करती हैं। और ईमानदारी से, मैं ऐप्पल को कभी "फिक्सिंग" नहीं देख सकता। मुझे लगता है कि यही कारण है कि वे पुराने सॉफ्टवेयर कंपोजिटिंग मॉडल के साथ इतने लंबे समय तक फंस गए हैं। यह एक कठिन समस्या है और वे उच्च-डीपीआई जाकर इसे अनदेखा करने की उम्मीद कर रहे हैं।

लेकिन वैसे भी, आपके विशिष्ट मामले में एसपीएए प्राप्त करने के कुछ तरीके हैं।

आप ढाल को फिर से बनाने की कोशिश कर सकते हैं और अपना टेक्स्ट खींचते समय इसे स्वयं खींच सकते हैं। लेकिन स्पष्ट रूप से यह भंगुर है यदि टूलबार ढाल ओएस अपडेट में बदल जाता है, और ढाल को ठीक से मिलान करने में मुश्किल हो सकती है।

या आप वास्तव में टूलबार पृष्ठभूमि की एक छवि को पकड़ने की कोशिश कर सकते हैं, या तो रनटाइम या समय से पहले, और इसे अपनी पृष्ठभूमि के रूप में खींचें।

+0

अंतिम सुझाव ऐसा लगता है कि यह एक अच्छा हो सकता है। मैं इसे आज़माउंगा और आपको बताऊंगा कि यह कैसे काम करता है। – indragie

+0

मैं धीरे-धीरे ढाल को फिर से तैयार कर रहा था और फिर इसे चित्रित कर रहा था, यह पूरी तरह से काम करता है। जैसा कि आपने कहा था, यह भविष्य के ओएस संशोधन में बदल सकता है लेकिन मुझे लगता है कि मेरे पास उस घटना के लिए तैयार करने का समय होगा ;-)। मैं इस उत्तर को सही के रूप में चिह्नित कर रहा हूं क्योंकि मैं वास्तव में इसे इस विधि के साथ काम करने में कामयाब रहा हूं, लेकिन रॉब का जवाब एक शानदार तकनीकी स्पष्टीकरण प्रदान करता है। – indragie

7

कारण उप-पिक्सेल एंटीअलाइजिंग संभव नहीं है कि दृश्यों के पीछे CALayers अनिवार्य रूप से केवल ओपनजीएल बनावट हैं।

इसका मतलब है कि वे बिटमैप हैंडल और सीधे GPU द्वारा प्रस्तुत किए जाते हैं। जीपीयू पाठ के बारे में कुछ भी नहीं जानता है और इसलिए उप-पिक्सेल एंटीअलाइजिंग लागू नहीं कर सकता है।

उप-पिक्सेल एंटीअलाइजिंग को संभालने के लिए, परत को संशोधित होने पर प्रत्येक बार परत सामग्री के पिक्सेल मानों को फिर से समझना होगा, जो कि निषिद्ध रूप से महंगा होगा और GPU पर परत को होस्ट करने के पूरे बिंदु को हटा देगा, जो कंपोजिटिंग और बेहद तेज प्रतिपादन करना है।

कारण यह है कि अपारदर्शी पृष्ठभूमि पर पाठ एसपीएए का उपयोग कर सकता है कि यह पाठ GPU पर परत बनावट को संग्रहीत करने से पहले उप-पिक्सेल एंटी-एलियासिंग के साथ पूर्व-प्रस्तुत किया जाता है। पाठ की पृष्ठभूमि पारदर्शी होने पर यह संभव नहीं है।

आपको इस सीमा के साथ रहना होगा। शुक्र है, यह अब कोई मुद्दा नहीं होगा जब हम अंत में सभी को हायडीपीआई डिस्प्ले मिलेंगे ... आईफोन पर एक नज़र डालें, जो सब-पिक्सेल एंटीअलाइजिंग नहीं करता है। आईफोन पर, टेक्स्ट उच्च स्क्रीन रिज़ॉल्यूशन के लिए ठीक है धन्यवाद।

+0

लेकिन किस बिंदु पर पाठ (उदा।, 'CATextLayer' से) प्रदान किया गया है? क्या इसे उप-पिक्सेल एंटीअलाइजिंग के साथ प्रस्तुत करने का कोई आसान तरीका नहीं है, जब तक आप जानते हैं कि यह हमेशा स्क्रीन पिक्सेल से गठबंधन होगा? – jtbandes

+0

जब भी यह बदलता है, पाठ को प्रस्तुत किया जाता है, और अनिवार्य रूप से बैकिंग ओपनजीएल बनावट के लिए बिटमैप के रूप में लिखा जाता है। मैं मानता हूं कि यह बहुत अच्छा होगा अगर किसी भी तरह से यह उन मामलों के लिए काम किया जा सकता है जहां एसपीएए की गणना करना संभव होगा, लेकिन दुर्भाग्यवश यह नहीं है। यदि आप इसे बदलना चाहते हैं तो एक बग रिपोर्ट सबमिट करें ... –

+0

लेकिन यह संभव है। यदि आपके पास एक ठोस पृष्ठभूमि के साथ एक टेक्स्ट फ़ील्ड (लेबल) है, भले ही उसके मूल दृश्य परत-समर्थित हों, ऐसा लगता है कि यह SPAA का उपयोग करता है। क्या होता है? – jtbandes

0

मेरे पास ओपनजीएल, एनीमेशन, रीयल-टाइम स्क्रॉलिंग टेक्स्ट में एक अच्छा अनुभव है, बहुआयामी एए का उपयोग करके बनावट पर पाठ प्रस्तुत करना।अल्फा के साथ एक 4 बाइट बनावट, पृष्ठभूमि की परवाह नहीं करता है या पारदर्शी नहीं है। ओपनजीएल वास्तविक समय में पारदर्शी बनावट प्रस्तुत करता है। और ग्लिफ के किसी भी छोटे बदलाव पर एक बनावट को रीमेक करना, माइक्रोसॉन्ड का सवाल है। ऐप्पल इसे ठीक कर सकता है।

संबंधित मुद्दे