flex फ्लेक्स प्रोफाइलिंग-क्या[enterFraameEvent] क्या कर रहा है?




profiling enterframeevent (6)

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

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

इसके अलावा, निकाल दिया गया बाइंडिंग की संख्या कम करने के लिए अस्थायी वस्तुओं का उपयोग करें। के बजाय...

myUser.location = नया स्थान (); myUser.location.state = "CO"; myUser.location.city = "डेनवर";

कर...

var tempLoc: स्थान = नया स्थान (); tempLoc.state = "CO"; tempLoc.city = "डेनवर"; myUser.location = tempLoc;

पूर्व में 3 बाइंडिंग को कुछ भी स्थान पर बाध्य किया जाता है। *, जबकि बाद में केवल 1 बाध्यकारी (केवल वास्तविकता में ही फ्लेक्स द्वारा संभालती है) की वजह से अतिरिक्त होती है।

बाइनिंग्स आपके एप को नहीं मारेंगे, जब तक आपके पास बहुत से एक नेत्रहीन अमीर ऐप्लिकेशन में नहीं हो .... बाध्यकारी और रेंडरिंग फ्लेक्स की सबसे धीमी नौकरी

एक और दिलचस्प बात: फ्लेक्स बिल्डर में एक नया फ्लेक्स 3 ऐप बनाएं और ब्राउज़र में इसे चलाएं। हमारे परीक्षणों से पता चला है कि CPU मैकबुक प्रो पर 8-10% के बीच रहता है (जब ऐप बेकार है, और ब्राउज़र विंडो छिपा हुआ है)। हमारा आवेदन अब ~ 20% पर स्थिरता चलाता है और जब भी दृश्य परिवर्तनों और समानता को नियंत्रित करने के लिए उच्च स्तर पर स्पाइक होता है, यह हमेशा एक स्तर पर 20% के करीब रहता है। हमारी प्रारंभिक चिंता यह थी कि मेमोरी रिसाव या कुछ दूर चल रहा था जो सीपीयू को बहुत अधिक ले जाएगा और यह लगभग 40-50% (फिर से, एमबीपी पर ... इस मशीन के सभी रिश्तेदार) पर घूम रहा है। हमने Degrafa के सभी संदर्भों को ले लिया और जब हमने प्रदर्शन का अच्छा प्रदर्शन देखा, तो यह सब कुछ के लिए खाता नहीं था रिक्त फ्लेक्स ऐप हालांकि प्रबुद्ध था - फ्लेक्स स्वयं हर समय 8-10% सीपीयू का उपयोग करता है, भले ही निष्क्रिय हो।

फिर भी एक और मिल ... अगर मेट का उपयोग करना, सावधान रहें कि आप दृश्य स्विचिंग कैसे संभालते हैं एमएसएमएल में इंजेक्टर और बाइंडिंग का इस्तेमाल करते हुए संपत्ति उपलब्ध होने में आसान है और जब उन्हें उपयोग नहीं किया जा रहा है, तो उन्हें छुपाएं और अक्षम करें, लेकिन फ्लेक्स चीजों को छुपाने / अक्षम करने के मामले में बहुत चतुर नहीं है मक्खी पर विचार बनाने के लिए सबसे अच्छा है, और जब ये किया जाए तो उन्हें नष्ट कर दें। हालांकि शुरुआती निर्माण में अधिक समय लग सकता है और विचारों के बीच लंबे समय तक इंतजार किया जा सकता है, यह दर्शाने के लिए कि दृश्य स्विचिंग हो रहा है, देखने के लिए तैयार करने के लिए प्रतीक्षा करें, और उसके बाद कुछ प्रदर्शन जादू (एक प्रगति बार, डिस्क कताई आदि) का उपयोग करें, और फिर इसे में फीका

इसके अलावा, नेत्रहीन अमीर ऐप्स के लिए व्यूस्टैक्स से दूर रहें अपना खुद का स्टैक प्रबंधित करें

अब तक यह धागा किसी भी भाषा के लिए बुनियादी प्रदर्शन मुद्दों पर चला गया है, लेकिन फ्लेक्स कई मायनों में एक बहुत ही खास छोटा लड़का है ("विशेष" हमेशा एक सकारात्मक बात नहीं माना जाता है)। इसमें असंख्य नुकसान हैं क्योंकि यह बहुत ही दृश्य मंच पर बनाया गया है, फिर भी यह आरआईए के लिए बनाया गया है, जबकि फ्लैश प्लेयर वीडियो, एनीमेशन आदि का अनुकूलन कर सकता है, यह फ्लेक्स ऐप को अनुकूलित नहीं करेगा। फ्लेक्स ऐप को फ्लैश ऐप के रूप में प्रदर्शित करने की अपेक्षा न करें। एएस 2 और एएस 3 के लिए एवीएम (एक्शन स्क्रिप्ट वर्चुअल मशीन) के बीच एक बड़ा अंतर भी है।

यह फ्लेक्स ऐप में कार्यक्षमता के मुद्दों और संभावित लाभ की सतह को खरोंच कर रहा है। यह एक गहरी कला है और यह देखने में आसान है कि क्यों

कोड, निंजा

मुझे फ्लेक्स आवेदन के साथ कुछ गंभीर प्रदर्शन समस्याओं को ढूंढने (और संभवत: फिक्सिंग) करने का काम सौंपा गया है जो हमें दिया गया था यह आवेदन बार-बार 50 से 100% सीपीयू में उठाएगा, जब यह केवल सुस्ती हो और कुछ भी नहीं किया जाना चाहिए।

फ्लेक्सबइल्डर के साथ आने वाले प्रोफाइलर को चलाने के लिए मेरा पहला कदम था मुझे उम्मीद थी कि कुछ तरीके जो ज्यादातर समय ले रहे थे, मुझे दिखा रहा था कि बाधा कहाँ थी। हालांकि, मुझे अप्रत्याशित कुछ मिला।

शीर्ष 4 तरीके थे:

  • [enterFrameEvent] - 84% संचयी, 32% आत्म समय
  • [काटना] - 20% संचयी और आत्म समय
  • [टिनकेन] - 8% संचयी और आत्म समय
  • global.isNaN - 4% संचयी और आत्म समय

सभी अन्य विधियों में संचयी और आत्म समय दोनों के लिए 1% से भी कम था।

जो मैंने पाया है, ऑनलाइन से, [ब्रैकेट किए गए विधियां] प्रोफ़ाइलर सूचियां हैं, जब दर्शाने के लिए कोई वास्तविक फ्लेक्स विधि नहीं होती है। मैंने किसी को दावा किया कि [टिनकेन] आरटीएमपी अनुरोधों का प्रसंस्करण है, और मुझे लगता है कि [रप] यह कचरा कलेक्टर है

क्या किसी को पता है कि [enterFraameEvent] वास्तव में क्या कर रहा है? मुझे लगता है कि यह इवेंट लूप के लिए "मुख्य" फ़ंक्शन है, इसलिए उच्च संचयी समय की उम्मीद है लेकिन आत्म समय इतनी ऊँचा क्यों है? वास्तव में क्या चल रहा है? मुझे उम्मीद नहीं थी कि खिलाड़ी के इंटरनल को इतने समय लेना चाहिए, खासकर जब ऐप में वास्तव में कुछ भी नहीं हो रहा है (और कोई यूआई अपडेट नहीं है)।

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



फ्लेक्स परियोजना के भीतर एक ऐसी चीजें हैं जो आम तौर पर एक एन्टरफ़्रेम हैंडलर पर होती हैं। कुछ चीजों को देखने के लिए

  1. मैनुअल <mycomponent enterFrame = ""> ईवेंट प्रतिक्रियाएं या जो कि घटक को जोड़ता है। AddEventListener (Event.ENTER_FRAME, myfunc)

  2. callLater () कॉल, ये ढांचा में एएलएटी हो और किसी भी संख्या में खरगोश के छेद को छलांग लगाने का उप-उत्पाद हो सकता है, डेवलपर्स समय से संबंधित समस्याओं को सुलझाने के लिए इन सभी का उपयोग करते हैं और कभी-कभी बुरा कोड इन्हें हर फ्रेम को कॉल करने के लिए प्रेरित कर सकता है। उदाहरण के लिए, नवीनतम फ्लेक्स एसडीके बिल्ड में कॉललाटर () की ~ 120 घटनाएं हैं।

  3. अंत में, मैं गारंटी नहीं दे सकता कि [enterframeEvent] केवल विशिष्ट ईवेंट कॉलबैक दर्ज करें, और टाइमर, माउस आदि नहीं। ईवेंट, मुख्य प्रविष्टि लूप के दौरान एन्टरफ्रेम उत्पन्न होने के बाद, आप सभी घटनाओं के फ़ायरिंग का संचयी परिणाम देख सकते हैं मुख्य घटना पूल से मैं यह नहीं कह रहा हूं कि यह क्या हो रहा है, लेकिन मैं यह नहीं कह सकता कि यह क्या हो रहा है या नहीं, मैं आंतरिकों के बारे में पर्याप्त जानकारी नहीं जानता हूं।

/ जैसा कि पहले कहा गया है, संपादित करें [enterFrameEvent] को तकनीकी रूप से प्रत्येक फ्रेम के शुरूआत में आंतरिक रूप से आग लगाना चाहिए, लेकिन उपयोगकर्ता कोड निष्पादित करने के लिए जब तक घटनाओं को स्पष्ट रूप से संलग्न नहीं किया गया हो,


इस पोस्ट के अपडेट को भविष्य में किसी को भी मिलना चाहिए ...

EffectiveUI में कुछ सहकर्मियों को कुछ महीने बाद उनके आवेदन के साथ यह सटीक समस्या थी, इसलिए इसे दोबारा गौर किया गया। यह पता चला था कि फ्लैश का इस्तेमाल दृश्य संपत्तियों का उपयोग करने के लिए, स्टेटफूल स्किन का उपयोग करना, और फ्लैश / फ्लेक्स संपत्ति टूलकिट के साथ एसडब्ल्यूसी को निर्यात करने पर, आप भगोड़ा फ्लैश फिल्में (संभवत: जिस तरह से यह कार्यान्वित किया जाता है, कहें, डालना भूलना फ़्रेमों में रोक () कमांड)।

जाहिरा तौर पर आप इस बारे में कुछ भी नहीं कर सकते, सिवाय इसके कि इसमें जाने और सभी राज्यपूर्ण खाल को हटा दें। एक अच्छा लिखना यहाँ पाया जा सकता है:

http://patrickhansen.com/blog/index.php/2009/03/05/flex-stateful-skins-vs-stateless?blog=3

और एक JSFL स्क्रिप्ट जिसे आप स्टेटफुल स्किन को स्टेटलेस स्किनों में कनवर्ट करने के लिए उपयोग कर सकते हैं:

http://patrickhansen.com/blog/index.php/2009/04/08/stateful-to-stateless-jsfl-flash-command?blog=3

उम्मीद है कि यह किसी को मदद करता है! यह एक बहुत बुरा, रहस्यमय बग है, लेकिन आप इसके आसपास काम कर सकते हैं!

चियर्स


जस्टिन, उत्तर के लिए धन्यवाद। मुद्दा एफ्रैम निष्पादन के साथ नहीं है, बल्कि यह प्रत्येक पुनरावृत्ति में बहुत अधिक करने की कोशिश करता है।

एफवाईआई: संयोग, मूल पोस्टर और मैं एक ही आवेदन के साथ काम कर रहे हैं। हमने प्रोग्रामेटिक स्किक्स के पक्ष में सभी डेग्ररा संसाधनों को निकालने का निर्णय लिया है। मैं यहां निष्कर्षों की रिपोर्ट करूँगा जब हम इसे पूरा कर लेंगे।


मुझे लगता है कि आपकी समस्या कहीं और है। ऐसा इसलिए होता है क्योंकि फ्लैक्स फ्लैश के शीर्ष पर बना रहता है और फ्लैश आग लगती है, जितनी बार फ़्रेमरेट के रूप में (जैसे कि 20-30 बार एक सेकंड)।

http://www.adobe.com/support/flash/action_scripts/actionscript_dictionary/actionscript_dictionary546.html

संपादित करें: मैं नहीं कह रहा हूँ कि आपका समाधान फ़्रेमरेट को कम करना होगा। यह केवल तभी काम करेगा जब इवेंट यू देखा गया था। मुझे विश्वास नहीं है कि यह वास्तव में आपके मंदी की वजह से है। यह एक ऐसा समारोह बुला सकता है जो मुद्दा पैदा कर रहा है ... लेकिन वह इवेंट स्वयं ही नहीं है। यह बहुत आग लगना है