2010-11-24 12 views
7

मेरे पास एक WPF एप्लिकेशन (.NET 4) है जिसमें मुख्य विंडो है, और उस मुख्य विंडो के अंदर कई छोटे UserControls दिखाते हैं। उपयोगकर्ता द्वारा किए गए विभिन्न कार्यों को UserControls का कारण बनता है जो विभिन्न डेटा के साथ विभिन्न अन्य नियंत्रणों द्वारा प्रतिस्थापित करने के लिए प्रदर्शित होते हैं।WPF प्रारंभिक कॉम्पोनेंट प्रदर्शन समस्याओं

हालांकि, इन नियंत्रणों को स्विच करते समय मैं प्रदर्शन समस्याओं में भाग रहा हूं। नियंत्रण लोड करते समय WPF प्रेषक धागा 100% CPU पर जाता है। पुरानी मशीनों पर, या बड़ी संख्या में नियंत्रणों के साथ, इसका परिणाम 30 सेकंड तक लॉक होने के लिए दिखाई दे रहा है!

रूपरेखा इंगित करता है कि लगभग सभी इस CPU समय के सभी विभिन्न UserControls के विभिन्न InitializeComponent तरीकों बुला खर्च किया जाता है - कोई भी नियंत्रण किसी भी अन्य की तुलना में बेहद बदतर हो गया लगता है, वे सब 0.2 और 0.5 के बीच सेकंड लेने के लिए लग रहे हैं (पर एक तेज प्रोसेसर और अच्छे ग्राफिक्स कार्ड के साथ मेरी देव मशीन)।

जहां तक ​​मुझे पता है, InitializeComponent वह जगह है जहां WPF वास्तव में संकलित xaml को स्मृति में लोड करता है।

मुझे यहां क्या करना है इसके लिए एक नुकसान हुआ है। मैं पृष्ठभूमि थ्रेड पर चीजों को पूर्व-प्रारंभ करना चाहता हूं, लेकिन सभी WPF नियंत्रणों को डिस्पैचर थ्रेड पर बनाया और उपयोग किया जाना चाहिए, इसलिए मुझे नहीं लगता कि यह संभव है।

अन्यथा ऐसा लगता है कि मेरे सभी एक्सएमएल को हटाने के लिए मेरे पास केवल एक ही विकल्प हैं ??

किसी भी मदद की बहुत सराहना की

किया जाएगा
+1

आपके ऐप (विशिष्ट विवरण + कोड) के बारे में और जानने के बिना, मैं केवल कल्पना कर सकता हूं कि आपके पास या तो बड़ी संख्या में उपयोगकर्ता नियंत्रण (+50) और/या बहुत भारी डेटा बाइंडिंग हैं। तो एकमात्र जवाब आपके आवेदन तर्क को फिर से डिजाइन करना होगा। आपको यह भी समझना चाहिए कि जब बड़ी मात्रा में नियंत्रण/डेटा की बात आती है तो डब्ल्यूपीएफ बिल्कुल बकवास होता है, क्योंकि यह बहुत ही अप्रचलित है (मुझे लगता है कि यह ढांचे का उच्च स्तर है)। शायद अपने ऐप के लिए WinForms को आजमाएं (जो थोड़ा बेहतर है) या देशी सी ++/डायरेक्टएक्स (एला फोटोशॉप, ऑटोकैड स्टाइल) में सब कुछ लिखें – Marko

+0

http://jeremiahmorrill.wordpress.com/2011/02/14/a- क्रिटिकल -डिप-डाइव-इन-द-डब्ल्यूपीएफ-रेंडरिंग-सिस्टम/- मुझे लगता है कि नियंत्रण लोड हो रहे हैं, प्रतिपादन उत्पन्न हो सकता है और शायद कैश किया जा सकता है। यह PIX (एक WPF perf टूल) का उल्लेख करता है जिसे आप आजमा सकते हैं। – gbjbaanb

उत्तर

0

InitializeComponent विधि क्योंकि यह आदि

मेरी केवल सुझाव दृश्य/तार्किक पेड़ में नियंत्रण सम्मिलित और सभी बाइंडिंग, थीम, उम्मीद संसाधनों को आश्वस्त करने की जरूरत है समय लगता है है - क्या शुरुआत से सभी संभावित नियंत्रण शुरू करना संभव है, और फिर Visibility संपत्ति का उपयोग करते समय उन्हें दिखाएं/छुपाएं?

आप कुछ यूआई को कैशिंग के लिए फ्रीजबल का उपयोग कर सकते हैं, लेकिन यदि वे उपयोगकर्ता नियंत्रण हैं तो संभवतः आप चाहते हैं कि आपका उपयोगकर्ता उनके साथ बातचीत करे।

+0

उत्तर के लिए धन्यवाद, लेकिन शुरुआत में हम सभी नियंत्रणों को सामने से लोड कर रहे थे, फिर केवल हमें दिखाए जा रहे थे। तब फॉर्म को पहली बार दिखाया गया था जब धीमा मशीनों पर एक मिनट (एक धीमी मशीनों पर एक मिनट से अधिक) था, जो मौजूदा व्यवहार की तुलना में एक और भी खराब उपयोगकर्ता अनुभव था :-( –

2

इस पर फिर से विचार करने के लिए - हमारे पास स्क्रीन पर कई जटिल नियंत्रण हैं, लेकिन हम डब्ल्यूपीएफ को खुश रखने के लिए उनसे छुटकारा नहीं पा सकते हैं!

रूपरेखा के साथ आगे प्रयोग से पता चला कि कस्टम नियंत्रण का उपयोग (मूल रूप से सिर्फ एक सी # वर्ग Control से सीधे पाने के लिए और एक Generic.xaml विषयों में यूआई को परिभाषित केवल लोडिंग के हिट उठाना लगते हैं और एक बार XAML फ़ाइल पार्स। इसके बाद, प्रत्येक नियंत्रण बस पहले से मौजूद विषय लागू होता है।

कस्टम नियंत्रण और अधिक कठिन UserControls से साथ काम करने की है, लेकिन यह हमारे लोड प्रदर्शन बहुत मदद करने लगते था।

0

रिकॉर्ड के लिए, मैं एक के साथ एक खिड़की थी 1500 ~ 2000 एमएस लोड समय, समस्या आइकन थी।

मैं XAML DrawingImage तत्वों को एसवीजी परिवर्तित करने के लिए एक उपकरण का उपयोग किया गया था, और हर इस्तेमाल किया आइकन

InitializeComponent के लिए एक ड्राइंग छवि के साथ एक बड़े संसाधन शब्दकोश के साथ एक उपयोगकर्ता नियंत्रण इतनी धीमी गति से था, क्योंकि यह है कि बड़े पार्स करने के लिए किया था छवियों के लिए सभी वेक्टर डेटा युक्त XAML फ़ाइल

आशा है कि इससे मदद मिलती है।

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