2008-09-16 6 views
12

हमें एक अनियमित ग्रिड में बड़ी संख्या में छोटे तारों को प्रदर्शित करने वाले C# Windows Forms एप्लिकेशन के लिए पाठ प्रतिपादन को अनुकूलित करने की आवश्यकता है। किसी भी समय 5000 से अधिक कोशिकाएं दिखाई दे सकती हैं जो प्रति सेकंड 4 बार अपडेट होती हैं। फ़ॉन्ट परिवार और आकार कोशिकाओं में सुसंगत है, हालांकि रंग सेल से सेल में भिन्न हो सकता है, जैसा कि बोल्ड/इटैलिक/सादा होगा।विंडोज फॉर्म में पाठ प्रस्तुत करने के लिए सबसे तेज़ एपीआई?

मैं होने के बारे में TextRenderer.DrawText बनाम Graphics.DrawString वेब पर परस्पर विरोधी जानकारी देखा है सबसे तेज/सबसे अच्छा है, जो Win32 स्तर पर एक GDI बनाम GDI+ तुलना करने के लिए कम कर देता है।

मैंने विंडोज एक्सपी बनाम विंडोज विस्टा पर मूल रूप से अलग-अलग परिणाम भी देखे हैं, लेकिन मेरा मुख्य लक्ष्य विंडोज एक्सपी है। लेख WinFX और DirectX 10 के तहत बहुत उपयोगी हैं :-)

यहां सबसे अच्छा तरीका क्या है? मुझे एक छोटी सी ++/सीएलआई परत शुरू करने और अधिक प्रदर्शन को निचोड़ने के लिए डिवाइस संदर्भ हैंडलिंग को अनुकूलित करने से डर नहीं है, लेकिन मुझे किस दिशा में लेने के बारे में कुछ निश्चित सलाह चाहिए।

संपादित करें: प्रारंभिक प्रतिक्रियाओं के लिए धन्यवाद। मैं पृष्ठभूमि बिटमैप प्रतिपादन और जीडीआई समकक्ष कॉल के साथ चिपके हुए संयोजन का प्रयास कर रहा हूं।

उत्तर

5

एक माइक्रोसॉफ्ट डेवलपर ने अपने ब्लॉग पर GDI vs. GDI+ Text Rendering Performance लेख पोस्ट किया है जो कच्चे गति के सवाल का जवाब देता है: अपने सिस्टम पर, जीडीआई ड्राटेक्स्ट जीडीआई + ड्रास्ट्रिंग से लगभग 6 गुना तेज था।

यदि आपको असली गति राक्षस होने की आवश्यकता है, तो टेक्स्टऑट DrawText से तेज़ है, लेकिन आपको क्लिपिंग और शब्द-लपेटने का ख्याल रखना होगा। ExtTextOut क्लिपिंग का समर्थन करता है।

जीडीआई प्रतिपादन (टेक्स्ट रेन्डरर) जीडीआई का उपयोग कर विंडोज के अन्य हिस्सों के साथ अधिक संगत होगा; जीडीआई + डिवाइस-स्वतंत्र होने की कोशिश करता है और इसलिए some spacing and emboldening are inconsistent। असंगत प्रतिपादन के उदाहरण के लिए SQL सर्वर 2005 सतह क्षेत्र कॉन्फ़िगरेशन टूल देखें।

+0

ब्लॉग लिंक में नमूना ऐप वह है जिसे मैंने Vista और XP के बीच बड़ा अंतर देखा - मेरे Vista पीसी, जीडीआई और जीडीआई + पर बराबर थे, जबकि XP ​​पर मुझे 6x अंतर लेखक का उल्लेख है .. यह शायद एक Vista ड्राइवर मुद्दा है, लेकिन यहां कुछ कठिनाइयों को हाइलाइट करता है - धन्यवाद! –

+1

ऐतिहासिक नोट: ExtTextOut कुछ कार्ड/ड्राइवरों पर ठोस आयत खींचने का सबसे तेज़ तरीका होता था :) –

2

जीडीआई सामान्य रूप से ड्राइंग पर जीडीआई तेज है कि जीडीआई +। मैंने एक ऐसे प्रोजेक्ट पर काम किया जिसने हजारों लाइनों और टेक्स्ट स्ट्रिंग्स को खींचना और जीडीआई + से जीडीआई में स्विच करना महत्वपूर्ण प्रदर्शन सुधार किया। वह विंडोज एक्सपी का उपयोग कर रहा था इसलिए मैं Vista पर टिप्पणी नहीं कर सकता। मैं आपके ड्राइंग के प्रदर्शन को बेहतर बनाने के लिए डबल बफरिंग का भी अनुशंसा करता हूं। एक संगत ऑफ स्क्रीन बिटमैप बनाएं और पुन: उपयोग करें कि प्रत्येक बार जब आपको आकर्षित करने की आवश्यकता होती है।

3

5000+ टेक्स्ट प्रतिपादन जीडीआई के साथ भी धीमा है, खासकर यदि आपको स्क्रॉलिंग की आवश्यकता है। एक अलग प्रतिपादन धागा बनाएं और प्रत्येक 200 एमएस और बिटब्लेट को वर्तमान परिणामों के यूआई थ्रेड को सूचित करें। यह एक चिकनी उपयोगकर्ता अनुभव देता है।

2

मूल कोड में ड्राइंग करने के लिए सी ++/सीएलआई इंटरऑप क्लास बनाना परिणामस्वरूप पागल-तेज ड्राइंग होगा। हमने इसे गवाह किया है और इसे मापा है।

यदि आप ऐसा करने के लिए नहीं हैं, तो हमें ग्राफिक्स मिल गए हैं। ड्रॉस्ट्रिंग TextRenderer.DrawText की तुलना में थोड़ा तेज है।

2

मेरे विंडोज 7 64 बिट सिस्टम टेक्स्टऑट पर DrawString की तुलना में थोड़ा धीमा है! TextRenderer.DrawText DrawString से बहुत धीमी है।

+1

मैंने यह भी खोजा ... लेकिन मुझे कोई कारण नहीं मिला !? – series0ne