2012-03-22 13 views
6

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

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

एक लम्बी कहानी ही समाप्त हो करने के लिए: मैं यह करने की जरूरत है या ब्राउज़र यहां तक ​​कि उन्हें बताए बिना इस तरह के मामले को संभालने के लिए बहुत चालाक हैं करते हैं (और मैं दृश्यता जाँच बचा सकता है)?


संपादित:

इसलिए मैं इस विषय पर कुछ "अनुसंधान" बना दिया है और बनाया this fiddle.

क्या होता है कि यह सिर्फ प्रति सेकंड 30 फ्रेम शोर उत्पन्न करता है। आंखों के लिए बहुत प्रसन्न नहीं है, लेकिन ... अच्छा हिस्सा व्यूपोर्ट को ब्लॉक करने के लिए सिर्फ एक सादा div है। जब मैं स्क्रॉल करता हूं और व्यूपोर्ट में canvas तत्व है CPU उपयोग मुझे बताता है कि यह लगभग 40% ले रहा है, तो स्पष्ट रूप से ब्राउजर के पास बहुत कुछ करना है। जब मैं बैक अप करता हूं तो मेरे पास मेरे व्यूपोर्ट में मैरून रंग div है और सीपीयू उपयोग को प्रोफाइल करने के लिए यह लगभग 10% तक गिर जाता है। जब मैं नीचे स्क्रॉल करता हूं: उपयोग फिर से बढ़ जाता है।

तो जब मैं की तरह एक दृश्यता की जांच लागू इस modified fiddle में, मैं वृद्धि (एक छोटे से एक ईमानदार होना) एक बूंद के बजाय CPU उपयोग में देखते हैं (जैसा कि कैनवास अगर जाँच के अतिरिक्त कार्य है कर व्यूपोर्ट के अंदर है)।

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

किसी को भी उस पर एक प्रकाश डाला सकता है मैं बहुत आभारी होगी!

उत्तर

8

मुझे लगता है कि आप के बीच तर्क चल रहा है कि क्या है और क्या प्रतिपादन हो रहा है असमंजस में हैं। कई ब्राउज़र्स अब हार्डवेयर को अपने कैनवस को तेज करते हैं, इसलिए सभी प्रतिपादन GPU पर होता है, इसलिए वास्तविक पिक्सेल पुशिंग में कोई CPU समय नहीं होता है। हालांकि आपके टिक फ़ंक्शन में सीपीयू पर यादृच्छिक शोर उत्पन्न करने के लिए गैर-तुच्छ कोड है। तो आप केवल इस बात से चिंतित हैं कि टिक फ़ंक्शन चल रहा है या नहीं।यदि कैनवास ऑफस्क्रीन है, तो निश्चित रूप से इसे डिस्प्ले पर प्रस्तुत नहीं किया जाएगा (यह दिखाई नहीं दे रहा है)। कैनवास ड्रॉ कॉल के लिए, यह शायद ब्राउज़र पर निर्भर करता है। यदि आप अचानक इसे वापस देखने के लिए स्क्रॉल करते हैं, तो यह सभी ड्रॉ कॉल को ऑफ-स्क्रीन कैनवास में प्रस्तुत कर सकता है, या यह केवल सभी ड्रॉ कॉल को कतारबद्ध कर सकता है और वास्तव में उनके साथ कुछ भी नहीं कर सकता जब तक कि आप कैनवास को देखने के लिए स्क्रॉल नहीं करते। मुझे यकीन नहीं है कि प्रत्येक ब्राउजर क्या करता है।

हालांकि, आप कैनवास एनिमेट के लिए setInterval या setTimeout उपयोग नहीं करना चाहिए। नया requestAnimationFrame एपीआई का प्रयोग करें। ब्राउज़रर्स नहीं जानते कि आप टाइमर कॉल में क्या करते हैं, इसलिए हमेशा टाइमर को कॉल करेंगे। दूसरी तरफ requestAnimationFrame विशेष रूप से दृश्य चीजों के लिए डिज़ाइन किया गया है, इसलिए ब्राउज़र को टिक फ़ंक्शन को कॉल करने का मौका नहीं है, या कैनवास या पृष्ठ दिखाई नहीं दे रहा है, उस दर को कम करने का अवसर है।

ब्राउज़र वास्तव में इसे कैसे संभालें, मुझे यकीन नहीं है। हालांकि, आपको निश्चित रूप से इसे प्राथमिकता देना चाहिए क्योंकि भविष्य के ब्राउज़र requestAnimationFrame को बेहतर तरीके से अनुकूलित करने में सक्षम हो सकते हैं, जिससे वे setInterval या setTimeout अनुकूलित नहीं कर सकते हैं। मुझे लगता है कि यदि पृष्ठ दृश्यमान नहीं है, तो आधुनिक ब्राउज़र सामान्य टाइमर को 1 हर्ट्ज तक भी कम कर देते हैं, लेकिन ब्राउज़र के लिए यह requestAnimationFrame अनुकूलित करने के लिए निश्चित रूप से बहुत आसान है, साथ ही कुछ ब्राउज़र आपको वी-सिंकिंग और अन्य अच्छीता के साथ प्राप्त करते हैं।

तो मुझे यकीन नहीं है कि requestAnimationFrame का अर्थ यह होगा कि कैनवास को देखने के बाहर स्क्रॉल किए जाने पर आपका टिक फ़ंक्शन नहीं कहा जाता है। तो मैं दोनोंrequestAnimationFrame और मौजूदा दृश्यता जांच का उपयोग करने की अनुशंसा करता हूं। आपको सबसे कुशल प्रतिपादन की गारंटी देनी चाहिए।

+0

वाह, उस सुपर गहन उत्तर के लिए बहुत बहुत धन्यवाद! मैंने पहले 'अनुरोधएनीमेशन फ्रेम' के बारे में सुना है, लेकिन मुझे हमेशा इसके बारे में क्या गड़बड़ है कि ऐसा लगता है कि यह 60fps पर चलने वाली एनीमेशन के लिए लक्षित है (जो मुझे लगता है कि कई प्रकार के एनीमेशन के लिए बहुत चिकनी लग रहा है)। इसे सीमित करने का एकमात्र तरीका मैं एक बार फिर से 'सेट इंटरवल' शामिल करने के बारे में सोच सकता था .... क्या आपको पता है कि क्या इसे प्रतिबंधित/बदलने का कोई तरीका है? – m90

+0

बहुत चिकनी है? मैंने कभी एनीमेशन के बारे में नहीं सुना है जो बहुत चिकनी है, उसके साथ क्या गलत है? : एस – AshleysBrain

+0

शायद अजीब लग सकता है, फिर भी मेरे पास शास्त्रीय एनीमेशन में पृष्ठभूमि है इसलिए मैं वास्तव में 12fps पर सोचता हूं, ऐसा सोच रहा हूं कि यह अब तक मेरे दिमाग का हिस्सा है। 95% मामलों में मेरा आपत्ति मूर्खतापूर्ण हो सकती है, फिर भी कुछ मामलों के लिए अधिक नियंत्रण रखना बहुत ही अच्छा होगा। – m90

2

मेरे अपने अनुभव से यह renders जो कुछ भी आप स्क्रीन पर स्थिति की परवाह किए बिना रेंडर करने के लिए यह बताना।

एक उदाहरण अगर आप टाइल्स आकर्षित, कि, आप अभी भी प्रदर्शन गिरावट देखेंगे जब तक आप स्क्रिप्ट को अनुकूलित करेंगे कैनवास आकार से बड़ा है।

एक प्रदर्शन की मांग एनीमेशन के साथ अपने कार्य की कोशिश करो, और यदि आप अभी भी वही परिणाम प्राप्त देखते हैं।

+0

सीपीयू उपयोग में गिरावट तब होती है जब पूरे ' 'तत्व को डिस्प्ले से बाहर स्क्रॉल किया जाता है। जैसा कि आपने लिखा है, यह एक फर्क नहीं पड़ता है यदि आप केवल 2px ऊंचाई या पूरी चीज़ देखते हैं। – m90

+0

यह वही कारण हो सकता है जब आप वेबसाइट से बाहर टैब करते हैं। ब्राउजर को पता है कि कैनवास दृश्य में नहीं है और वहां निष्क्रिय मोड में जाता है। टैब्बिंग करने का प्रयास करें और 5 मिनट बाद वापस आना और एनीमेशन मोटे तौर पर जहां आपने छोड़ा था। – justanotherhobbyist

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