ActionScript 3
प्रदर्शन का अनुकूलन
खोज…
वेक्टर आधारित ग्राफिक्स
वेक्टर आधारित ग्राफिक्स को डेटा के बहुतायत द्वारा दर्शाया जाता है जिसे सीपीयू (वेक्टर पॉइंट, आर्क, रंग, आदि) द्वारा गणना की जानी चाहिए। न्यूनतम बिंदुओं और सीधी रेखाओं के साथ सरल आकृतियों के अलावा कुछ भी बड़ी मात्रा में सीपीयू संसाधन का उपभोग करेगा।
एक "कैश के रूप में बिटमैप" झंडा है जिसे चालू किया जा सकता है। यह ध्वज वेक्टर आधारित डिस्प्लेऑब्जेक्ट को अधिक तेज रिड्रॉस् के लिए खींचने का परिणाम संग्रहीत करता है। इसका नुकसान यह है कि यदि वस्तु में कोई परिवर्तन लागू किया जाता है, तो पूरी चीज को फिर से तैयार किया जाना चाहिए और फिर से कैश किया जाना चाहिए। यह फ्रेम-बाय-फ्रेम ट्रांसफ़ॉर्मेशन लागू होने (घुमाव, स्केलिंग, आदि) होने पर इसे चालू न करने की तुलना में धीमा हो सकता है।
आमतौर पर, बिटमैप्स का उपयोग करने वाले ग्राफिक्स का प्रतिपादन वेक्टर ग्राफिक्स के उपयोग की तुलना में कहीं अधिक बेहतर है। फ़्लेक्सेल जैसी लाइब्रेरी फ़्लैमरेट को कम किए बिना "कैनवस" पर स्प्राइट के प्रतिपादन के लिए इसका लाभ उठाती हैं।
टेक्स्ट
रेंडरिंग टेक्स्ट में CPU की बहुत खपत होती है। फ़ॉन्ट्स वेक्टर ग्राफिक्स के समान फैशन में प्रस्तुत किए जाते हैं और हर वर्ण के लिए कई वेक्टर बिंदु होते हैं। टेक्स्ट फ़्रेम-बाय-फ़्रेम में परिवर्तन प्रदर्शन को नीचा दिखाएगा। "बिटमैप के रूप में कैश" झंडा बहुत उपयोगी है यदि सही तरीके से उपयोग किया जाता है, तो इसका मतलब है कि आपको बचना चाहिए:
- पाठ को बार-बार बदलना।
- पाठ क्षेत्र को बदलना (घूमना, स्केल करना)।
if
एक बयान में पाठ अद्यतन रैपिंग जैसी सरल तकनीक एक बड़ा फर्क पड़ेगा:
if (currentScore !== oldScore) {
field.text = currentScore;
}
पाठ को फ्लैश में निर्मित एंटी-अलियास रेंडरर का उपयोग करके, या "डिवाइस फोंट" का उपयोग करके प्रदान किया जा सकता है। "डिवाइस फोंट" का उपयोग करना पाठ को बहुत तेजी से प्रस्तुत करता है, हालांकि यह पाठ को दांतेदार (अलियास) प्रकट करता है। इसके अलावा, डिवाइस फोंट को आपके अंतिम उपयोगकर्ता द्वारा पूर्व-इंस्टॉल किए जाने की आवश्यकता होती है, या उपयोगकर्ता के पीसी पर पाठ "गायब" हो सकता है, हालांकि यह आपके ऊपर ठीक दिखाई देता है।
field.embedFonts = false; // uses "device fonts"
वेक्टर और प्रत्येक बनाम सरणियों और के लिए
का उपयोग करते हुए Vector.<T>
प्रकार और for each
पाश एक पारंपरिक सरणी से और अधिक performant है for
पाश:
अच्छा:
var list:Vector.<Sprite> = new <Sprite>[];
for each(var sprite:Sprite in list) {
sprite.x += 1;
}
खराब:
var list:Array = [];
for (var i:int = 0; i < list.length; i++) {
var sprite:Sprite = list[i];
sprite.x += 1;
}
तेजी से सरणी आइटम हटाने
यदि आपको किसी विशेष क्रम में होने के लिए किसी सरणी की आवश्यकता नहीं है, तो pop()
साथ एक छोटी सी चाल आपको splice()
की तुलना में अत्यधिक प्रदर्शन लाभ प्रदान करेगी।
जब आप एक सरणी splice()
करते हैं, तो उस सरणी में बाद के तत्वों के सूचकांक को 1 से कम करने की आवश्यकता होती है। यह प्रक्रिया समय का एक बड़ा हिस्सा उपभोग कर सकती है यदि सरणी बड़ी है और आपके द्वारा हटाए जा रहे ऑब्जेक्ट उस सरणी की शुरुआत के करीब है। ।
यदि आप सरणी में तत्वों के क्रम की परवाह नहीं करते हैं, तो आप उस आइटम को प्रतिस्थापित कर सकते हैं जिसे आप उस आइटम से हटाना चाहते हैं जिसे आप सरणी के अंत से pop()
करते हैं। इस तरह, सरणी में अन्य सभी वस्तुओं के अनुक्रमित समान रहते हैं और प्रक्रिया आपके प्रदर्शन में गिरावट नहीं करती है क्योंकि आपकी सरणी की लंबाई बढ़ती है।
उदाहरण:
function slowRemove(list:Array, item:*):void {
var index:int = list.indexOf(item);
if (index >= 0) list.splice(index, 1);
}
function fastRemove(list:Array, item:*):void {
var index:int = list.indexOf(item);
if (index >= 0) {
if (index === list.length - 1) list.pop();
else {
// Replace item to delete with last item.
list[index] = list.pop();
}
}
}
ऐरे के बजाय वैक्टर
फ़्लैश प्लेयर 10 ने वेक्टर की शुरुआत की। <*> जेनेरिक सूची प्रकार जो ऐरे से तेज था। हालांकि, यह पूरी तरह सच नहीं है। केवल निम्न वेक्टर प्रकार ऐरे समकक्षों की तुलना में तेज़ होते हैं, जिस तरह से वे फ़्लैश प्लेयर में लागू होते हैं।
-
Vector.<int>
- 32-बिट पूर्णांक के वेक्टर -
Vector.<uint>
- 32-बिट अहस्ताक्षरित पूर्णांक के वेक्टर -
Vector.<Double>
- 64-बिट फ़्लोट्स का वेक्टर
अन्य सभी मामलों में, सभी ऑपरेशन (निर्माण, हेरफेर, आदि) के लिए एक ऐरे का उपयोग करना वैक्टर का उपयोग करने से अधिक प्रदर्शनकारी होगा। हालांकि, यदि आप अपने कोड को "दृढ़ता से टाइप" करना चाहते हैं तो आप मंदी के बावजूद वैक्टर का उपयोग कर सकते हैं। FlashDevelop में एक सिंटैक्स होता है, जो /*ObjectType*/Array
का उपयोग करके, Arrays के लिए भी काम करने के लिए कोड पूरा करने में सक्षम बनाता है।
var wheels:Vector.<Wheel> // strongly typed, but slow
var wheels:/*Wheel*/Array // weakly typed, but faster
पुन: उपयोग करना और ग्राफिक्स बनाना
बनाना और विन्यस्त करने Sprite
और TextField
कार्यावधि में वस्तुओं महंगा हो सकता है अगर आप एक भी फ्रेम पर इन लाखों बना रहे हैं। इसलिए एक आम चाल बाद में पुन: उपयोग के लिए इन वस्तुओं को "पूलिंग" करना है। याद रखें कि हम न केवल निर्माण समय ( new Sprite()
) बल्कि कॉन्फ़िगरेशन (डिफ़ॉल्ट गुणों की सेटिंग) का अनुकूलन करने की कोशिश कर रहे हैं।
आओ हम कहते हैं कि हम सैकड़ों TextField ऑब्जेक्ट्स का उपयोग करके एक सूची घटक बना रहे थे। जब आपको एक नई ऑब्जेक्ट बनाने की आवश्यकता होती है, तो जांचें कि क्या किसी मौजूदा ऑब्जेक्ट का पुन: उपयोग किया जा सकता है।
var pool:Array = [];
if (pool.length > 0){
// reuse an existing TextField
var label = pool.pop();
}else{
// create a new TextField
label = new TextField();
// initialize your TextField over here
label.setDefaultTextFormat(...);
label.multiline = false;
label.selectable = false;
}
// add the TextField into the holder so it appears on-screen
// you will need to layout it and set its "text" and other stuff seperately
holder.addChild(label);
बाद में, जब आप अपने घटक को नष्ट कर रहे हैं (या इसे स्क्रीन से हटा रहे हैं), अप्रयुक्त लेबल को वापस पूल में जोड़ना याद रखें।
foreach (var label in allLabels){
label.parent.removeChild(label); // remove from parent Sprite
pool.push(label); // add to pool
}
ज्यादातर मामलों में वैश्विक पूल के बजाय प्रति उपयोग पूल बनाना सबसे अच्छा है। एक वैश्विक पूल बनाने के लिए नुकसान यह है कि आपको अन्य कार्यों द्वारा की गई सेटिंग्स को नकारने के लिए, पूल से इसे पुनः प्राप्त करने के लिए हर बार ऑब्जेक्ट को फिर से शुरू करना होगा। यह समान रूप से महंगा है और पहले स्थान पर पूलिंग का उपयोग करने के प्रदर्शन को बढ़ावा देता है।