एकता के लिए अनुकूलन युक्तियाँ

Unity एक गेम इंजन है जो न केवल इंडी डेवलपर्स बल्कि बड़ी कंपनियों के बीच भी लोकप्रिय है।

इसमें एक उपयोगकर्ता के अनुकूल इंटरफ़ेस, एक शक्तिशाली रेंडरिंग पाइपलाइन, एक उपयोग में आसान घटक प्रणाली है, और अंत में, यह प्लेटफार्मों की एक विशाल श्रृंखला का समर्थन करता है।

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

यहां 3 प्रमुख श्रेणियों ( रेंडरिंग , स्क्रिप्टिंग और ऑडियो ) के लिए महत्वपूर्ण युक्तियां दी गई हैं जो आपके गेम के प्रदर्शन को बेहतर बनाने में आपकी सहायता करेंगी:

प्रतिपादन

टिप 1: रेंडरर घटक के साथ ऑब्जेक्ट को स्केल रहित रखें

अनस्केल्ड वस्तुएँ वे होती हैं जिनका पैमाना (1, 1, 1) होता है। उस स्थिति में, Unity प्रत्येक फ्रेम में ऑब्जेक्ट को दोबारा स्केल करने के लिए अतिरिक्त गणना करने की आवश्यकता नहीं होती है।

उदाहरण: मान लीजिए कि आपके पास एक घर का मॉडल है जो आपके स्तर के लिए बहुत बड़ा या बहुत छोटा है। स्वाभाविक बात यह है कि इसे इस प्रकार स्केल किया जाए:

भवन का आकार बदलना

अधिकांश समय दृश्य दृश्य में ऑब्जेक्ट को स्केल करना ठीक है, लेकिन यदि आप उस ऑब्जेक्ट के बहुत सारे डुप्लिकेट उदाहरण रखने की योजना बनाते हैं, तो आयात सेटिंग्स में स्केल को बदलना बेहतर होगा।

पहली चीज़ जो आपको करने की ज़रूरत है वह मॉडल को तब तक स्केल करना है जब तक यह आपकी आवश्यकताओं के अनुरूप न हो (उदाहरण के लिए ऊपर की इमारत को (1, 1, 1) से (0.49482, 0.49482, 0.49482) तक स्केल किया गया था), फिर प्रोजेक्ट में मॉडल का चयन करें देखें और आयात सेटिंग्स में स्केल फैक्टर नोट करें (आमतौर पर यह 1 या 0.1 होता है)।

नया मान सेट करें, जो डिफ़ॉल्ट स्केल फ़ैक्टर को नए स्केल से गुणा करने के बराबर होना चाहिए (मेरे मामले में यह 1 x 0.49482 = 0.49482 है), फिर लागू करें पर क्लिक करें। अब दृश्य दृश्य में मॉडल पर वापस जाएं और स्केल को वापस (1, 1, 1) पर सेट करें।

एकता 3डी स्केल फ़ैक्टर सेटिंग्स

डिफ़ॉल्ट (1, 1, 1) स्केल को संरक्षित करते हुए ऑब्जेक्ट को अब आपकी आवश्यकता के अनुसार स्केल किया गया है।

यह टिप एनिमेटेड ऑब्जेक्ट्स के लिए विशेष रूप से महत्वपूर्ण है जो SkinnedMeshRenderer का उपयोग करते हैं क्योंकि यह घटक रेंडर करने के लिए अधिक महंगा है, और (1, 1, 1) का स्केल होने से रेंडरिंग प्रक्रिया सरल हो जाती है।

टिप 2: जितना संभव हो उतना कम रोशनी का उपयोग करें

लाइटें 3 प्रकार की होती हैं Unity (दिशात्मक लाइट, प्वाइंट लाइट और स्पॉटलाइट)। प्रदर्शन के मामले में रेंडरिंग के लिए दिशात्मक प्रकाश सबसे सस्ता है, उसके बाद प्वाइंट और अंत में स्पॉटलाइट।

आम तौर पर, आप प्रति दृश्य 1 से अधिक दिशात्मक प्रकाश नहीं रखना चाहते हैं, और स्पॉट और पॉइंट लाइट के लिए जितना संभव हो उतना कम (या बिल्कुल भी नहीं) रखने का प्रयास करें।

वास्तविक समय की छाया के संदर्भ में, जबकि यह गेम के दृश्य पहलू को बढ़ाता है, इसमें उच्च प्रदर्शन वाला ओवरहेड होता है इसलिए आम तौर पर, उन्हें अक्षम करना या उन्हें लाइटमैप और लाइट जांच में बेक करना बेहतर होता है

टिप 3: पारदर्शी शेडर्स का उपयोग सावधानी से करें

केवल उन सतहों पर पारदर्शी या पार्टिकल शेडर्स का उपयोग करें जिन्हें पारदर्शी होना आवश्यक है (उदा. बाड़, धुएं के कण, आदि)

पारदर्शिता वाली वस्तुओं के लिए अतिरिक्त रेंडरिंग पास की आवश्यकता होती है जो प्रदर्शन को कम कर सकता है, खासकर मोबाइल या वेब जैसे सीमित संसाधनों वाले प्लेटफार्मों पर।

स्क्रिप्टिंग

युक्ति 1: हमेशा घटक संदर्भों को कैश करें

यदि आप घटक संदर्भों को हर अपडेट तक एक्सेस करने की योजना बनाते हैं तो आपको हमेशा उन्हें कैश करना चाहिए।

उदाहरण के लिए, नीचे दी गई स्क्रिप्ट की जाँच करें:

खराब

using UnityEngine;

public class Script1 : MonoBehaviour
{
    float someValue = 0;

    // Update is called once per frame
    void Update()
    {
        someValue = GetComponent<Script2>().someValue2;
    }
}

यहां हमारे पास Script1 है जो Script2 से वेरिएबल प्राप्त करता है "someValue2" और इसे एक स्थानीय वेरिएबल को निर्दिष्ट करता है।

अब, प्रत्येक फ्रेम में केवल एक GetComponent को कॉल करने से प्रदर्शन पर कोई प्रभाव नहीं पड़ेगा, हालाँकि, आपको उन घटकों को कैशिंग करने की आदत अपनानी चाहिए जिनका उपयोग अक्सर किया जाएगा।

किसी स्क्रिप्ट में किसी घटक को कैश करने के दो तरीके हैं, या तो एक सार्वजनिक वैरिएबल बनाएं और इसे इंस्पेक्टर व्यू में असाइन करें, या एक निजी वैरिएबल बनाएं और इसे स्टार्ट या अवेक से असाइन करें। नीचे दिए गए उदाहरण की जाँच करें:

अच्छा

using UnityEngine;

public class Script1 : MonoBehaviour
{

    float someValue = 0;

    Script2 script2Cached;

    // Use this for initialization
    void Start()
    {
        script2Cached = GetComponent<Script2>();
    }

    // Update is called once per frame
    void Update()
    {
        someValue = script2Cached.someValue2;
    }
}

बहुत बेहतर, स्क्रिप्ट2 को अब प्रत्येक अपडेट तक बिना प्रदर्शन ओवरहेड के एक्सेस किया जा सकता है।

बॉक्सकोलाइडर, रिगिडबॉडी इत्यादि जैसे अंतर्निहित घटकों के लिए भी ऐसा ही करें (ट्रांसफॉर्म और गेमऑब्जेक्ट को छोड़कर, वे पहले से ही डिफ़ॉल्ट रूप से कैश्ड हैं ताकि आप उन्हें तुरंत एक्सेस कर सकें)।

टिप 2: सेंडमैसेज का उपयोग सावधानी से करें

सेंडमैसेज आपको गेम ऑब्जेक्ट से जुड़े प्रत्येक मोनोबिहेवियर पर एक विशिष्ट फ़ंक्शन (यदि मौजूद है) को कॉल करने की सुविधा देता है।

उदाहरण के लिए, जब आप गेम में कोई हथियार चलाते हैं तो आप GetComponent और अन्य अतिरिक्त सामग्री का उपयोग किए बिना, जब गोली दुश्मन को लगती है तो तुरंत नुकसान पहुंचा सकते हैं।

हालाँकि, इस विधि को बार-बार नहीं बुलाया जाना चाहिए क्योंकि यह काफी गणना-गहन है।

टिप 3: GameObject.Find और GameObject.FindWithTag का सावधानी से उपयोग करें

GameObject.Find, GameObject.FindWithTag और GameObject.FindGameObjectsWithTag आपको दृश्य में वस्तुओं को शीघ्रता से खोजने की सुविधा देता है। ये विधियाँ GetComponent की तुलना में बहुत धीमी हैं और इनका उपयोग केवल आरंभीकरण के दौरान किया जाना चाहिए।

युक्ति 4: OnGUI का उपयोग करने से बचें

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

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

एक चीज़ जो आप कर सकते हैं वह यह है कि एक अलग स्क्रिप्ट रखें जिसमें केवल OnGUI हो और ज़रूरत पड़ने पर इसे सक्षम/अक्षम करें।

उदाहरण के लिए:

यूआईस्क्रिप्ट.सीएस

using UnityEngine;

public class UIScript : MonoBehaviour {

    void OnGUI()
    {
        if(GUI.Button(new Rect(5, 5, 125, 25), "Button 1"))
        {
            //Button 1 was pressed, Do Something
        }
        if (GUI.Button(new Rect(140, 5, 125, 25), "Button 2"))
        {
            //Button 2 was pressed, Do Something
        }
    }
}

Script1.cs

using UnityEngine;

public class Script1 : MonoBehaviour
{

    UIScript uiScript;

    // Use this for initialization
    void Start()
    {
        uiScript = GetComponent<UIScript>();
        uiScript.enabled = false;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Tab))
        {
            //toggle UIScript when Tab is pressed
            uiScript.enabled = !uiScript.enabled;
        }
    }
}

UIScript और Script1 दोनों एक ही GameObject से जुड़े हुए हैं। स्क्रिप्ट1 नियंत्रित करता है कि मेनू कब दिखाना है।

जब खिलाड़ी टैब दबाता है तो यूआईस्क्रिप्ट सक्षम हो जाती है, जो बटन दिखाती है। टैब को दोबारा दबाने से यह निष्क्रिय हो जाता है, बटन छिप जाते हैं।

जबकि यूआईस्क्रिप्ट निष्क्रिय है, ऑनजीयूआई पद्धति को नहीं बुलाया जाता है जिससे प्रदर्शन में सुधार होता है।

टिप 5: प्रोफाइलर का उपयोग करें

जब बाधाओं और एफपीएस ड्रॉप्स की पहचान करने की बात आती है तो प्रोफाइलर सबसे महत्वपूर्ण उपकरणों में से एक है, जिससे कम प्रदर्शन का सटीक कारण ढूंढना आसान हो जाता है।

ऑडियो

ऑडियो क्लिप्स को यह सुनिश्चित करके अनुकूलित किया जा सकता है कि उनकी आयात सेटिंग्स सही हैं।

इष्टतम ऑडियो आयात सेटिंग्स ऑडियो की लंबाई, प्ले फ़्रीक्वेंसी और लक्ष्य प्लेटफ़ॉर्म पर निर्भर करेंगी।

सुझाए गए लेख
एकता के लिए बिलबोर्ड जनरेटर
सर्वश्रेष्ठ प्रदर्शन के लिए यूनिटी ऑडियो क्लिप आयात सेटिंग्स
एकता में अद्यतन का उपयोग कैसे करें
एकता प्रोफाइलर का उपयोग करके अपने गेम को अनुकूलित करें
यूनिटी में मोबाइल गेम के प्रदर्शन में सुधार
एकता के लिए ट्विटर युक्तियाँ
एकता में 2डी और 3डी विकास परिवेश की तुलना करना