2011-03-23 7 views
37

यदि किसी डब्ल्यूपीएफ एप्लिकेशन की स्क्रीन में बहुत से आदिम नियंत्रण होते हैं, तो इसका प्रतिपादन सुस्त हो जाता है। ऐसे नियंत्रण में एक डब्ल्यूपीएफ आवेदन की प्रतिक्रिया में सुधार करने के लिए अनुशंसित तरीके क्या हैं, कम नियंत्रण जोड़ने और अधिक शक्तिशाली वीडियोकार्ड का उपयोग करने के अलावा?डब्ल्यूपीएफ यूआई रेंडरिंग गति में सुधार करने के तरीके

क्या किसी भी तरह से ऑफस्क्रीन बफरिंग या ऐसा कुछ करने का कोई तरीका है?

+0

क्या आप कुछ संख्या दे सकते हैं? प्रति खिड़की आदि के नियंत्रण की संख्या आदि – NVM

+0

@NVM व्यावहारिक रूप से, अब यह प्रति विंडो के बारे में एक हजार कस्टम नियंत्रण है (कस्टम नियंत्रण में कई सीमाएं, टेक्स्टब्लॉक होते हैं और इसमें लगभग दर्जन निर्भरता गुण होते हैं)। नियंत्रण की संख्या बढ़ सकती है। लेकिन पहले से ही इस मात्रा में इनटाइटल प्रतिपादन पर खुद को देखने के लिए कुछ असुविधाजनक संख्याएं लगती हैं। इसके अतिरिक्त यह ज़ूम अप होने पर अच्छी चिकनी स्क्रॉलिंग प्रदान नहीं करता है। – rem

+0

मुझे उपयोगकर्ता के सामने एक ही समय में एक हजार टेक्स्ट बॉक्स वाले UI को विज़ुअलाइज़ करना मुश्किल लगता है। वैसे भी, सब कुछ व्यवस्थित करने के तरीके के आधार पर आप या तो वर्चुअलाइजिंग पैनलों में से एक का उपयोग कर सकते हैं या अपना खुद का कस्टम लिख सकते हैं जो केवल दिखाई देने वाले नियंत्रण बनाएगा। इससे चीजों को काफी तेज करना चाहिए। – NVM

उत्तर

43

हमारी टीम को प्रदर्शन प्रस्तुत करने की समस्याओं का सामना करना पड़ा । हमारे मामले में हमारे पास लगभग 400 परिवहन इकाइयां हैं और हमें प्रत्येक इकाई के चार्ट को बहुत सारे विवरण (पाठ लेबल, विशेष अंक, विभिन्न ज्यामिति इत्यादि) प्रस्तुत करना चाहिए।

पहले हमारे कार्यान्वयन में हमने प्रत्येक चार्ट को प्राइमेटिव में विभाजित किया और बाध्यकारी के माध्यम से पूरे इकाई के चार्ट को बनाया। यह बहुत दुखी विलुप्त था। यूआई प्रतिक्रिया बहुत धीमी थी।

इसलिए हमने प्रत्येक इकाई के लिए एक UI तत्व बनाने का निर्णय लिया, और DrawingContext के साथ चार्ट प्रस्तुत किया। हालांकि यह प्रदर्शन पहलू में काफी बेहतर था, लेकिन हमने एक महीने में प्रतिपादन में सुधार किया।

कुछ सलाह:

  1. कैश सब कुछ। ब्रश, रंग, ज्यामिति, स्वरूपित ग्रंथ, ग्लिफ। (। उदाहरण के लिए हम दो वर्गों है:।। दोनों वर्गों की साझा उदाहरण के लिए RenderTools और प्रत्येक इकाई पतों की TextCache प्रतिपादन प्रक्रिया तो अगर दो चार्ट टेक्स्ट समान है, इसकी तैयारी सिर्फ एक बार निष्पादित किया जाता है)
  2. फ्रीज Freezable, आप अगर लंबे समय तक इसका इस्तेमाल करने की योजना बना रहे हैं। विशेष रूप से ज्यामिति। जटिल unfreezed ज्यामिति HitTest बेहद धीमी गति से निष्पादित।
  3. प्रत्येक आदिम के प्रतिपादन के सबसे तेज़ तरीके चुनें। उदाहरण के लिए, पाठ प्रतिपादन के लगभग 6 तरीके हैं, लेकिन सबसे तेज़ DrawingContext.DrawGlyphs है।
  4. हॉट स्पॉट खोजने के लिए प्रोफाइलर का उपयोग करें। उदाहरण के लिए, हमारी परियोजना में हमारे पास ज्यामिति कैश थी और मांग पर उचित रूप से प्रस्तुत किया गया था। ऐसा लगता है कि कोई सुधार संभव नहीं है। लेकिन एक दिन हमने सोचा कि क्या होगा यदि हम एक बार ज्यामिति प्रस्तुत करेंगे और तैयार दृश्यों को कैश करेंगे? हमारे मामले में ऐसा दृष्टिकोण स्वीकार्य हुआ। हमारे यूनिट के चार्ट में केवल कई राज्य हैं। जब चार्ट का डेटा बदल जाता है, तो हम प्रत्येक राज्य के लिए DrawingVisual का पुनर्निर्माण करते हैं और उन्हें कैश में डाल देते हैं।

बेशक, इस तरह से कुछ निवेश की जरूरत है, यह सुस्त और उबाऊ काम है, लेकिन परिणाम शानदार है।

वैसे: जब हमने डब्ल्यूपीएफ कैशिंग विकल्प चालू किया (आपको जवाब में लिंक मिल सकता है), तो हमारा ऐप लटका हुआ था।

+0

मुझे एहसास है कि यह पोस्ट थोड़ा पुराना है, लेकिन मैं सोच रहा हूं कि ब्रश, रंग और व्हाट्नॉट को कैश करने के लिए आपने किन विधियों का उपयोग किया था। मुझे लगता है कि अगर मैं जानता हूं कि यह कैसे करना है तो मैं संभवतः कुछ अंतराल से बच सकता हूं। –

+4

[यहां] (http://pastebin.com/v83XZLTc) मैंने अपने RenderTools ऑब्जेक्ट का सरलीकृत संस्करण अपलोड किया। और [यहां] (http://pastebin.com/e8VhuHez) उपयोग उदाहरण है। यदि आपके पास अभी भी प्रश्न पूछने के लिए स्वतंत्र हैं। –

+0

बहुत बहुत धन्यवाद। मैं उन्हें देख लूंगा। –

3

नया (.NET 4.0) कैशिंग विकल्प देखें। (here देखें।)

+0

सिल्वरलाइट के लिए ही नहीं है? –

+0

@mark: नहीं, यह नहीं है। मैंने इसे WPF परियोजनाओं में उपयोग किया है। आप अन्य समर्थित ढांचे को देखने के लिए लिंक किए गए पृष्ठ में "अन्य संस्करण" लिंक पर क्लिक कर सकते हैं। – Jens

5

मैं एक वर्ष के बाद से एक भारी अनुकूलित datagrid के साथ एक ही पर्फ़ मुद्दा मिला है, और मेरा निष्कर्ष यह है:

वहाँ मूल रूप से बिना कुछ भी नहीं है कि आप अपने पक्ष पर कर सकते हैं (है आप एप्लिकेशन को प्रभावित करने, अर्थात्: लिंक जेन्स ने उल्लेख केवल डिफ़ॉल्ट शैलियों का उपयोग कर रहा कम नियंत्रण या )

महान लेकिन आपके मामले में बेकार है।

एनवीएम द्वारा प्रदान किया गया "अनुकूलित WPF अनुप्रयोग प्रदर्शन" लिंक लगभग मेरे अनुभव में लगभग बेकार है: यह केवल सामान्य ज्ञान के लिए अपील करता है और मुझे विश्वास है कि आप असाधारण या तो कुछ भी सीख नहीं पाएंगे। शायद एक चीज़ को छोड़कर: मुझे यह कहना होगा कि इस लिंक ने मुझे अपने ऐप के संसाधन में जितना संभव कर दिया है उतना ही सिखाया। चूंकि डब्ल्यूपीएफ आपके द्वारा संसाधन में रखे गए किसी भी चीज को पुन: स्थापित नहीं करता है, इसलिए यह उसी संसाधन को फिर से उपयोग करता है। तो आप वहां जितना भी कर सकते हैं (शैलियों, ब्रश, टेम्पलेट्स, फोंट ...)

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

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