इस दस्तावेज़ में, सीपीयू और जीपीयू की परफ़ॉर्मेंस को बेहतर बनाने के लिए टूल इस्तेमाल करने का तरीका बताया गया है. इन टूल की मदद से, सीपीयू और जीपीयू की परफ़ॉर्मेंस में आने वाली रुकावटों का पता लगाया जा सकता है और उन्हें ठीक किया जा सकता है.
सीपीयू ऑप्टिमाइज़ेशन
अगर विश्लेषण से पता चलता है कि गेम सीपीयू पर निर्भर है, तो आगे की जांच करना ज़रूरी है. इसके लिए, उन थ्रेड या एपीआई की पहचान करना ज़रूरी है जिनकी वजह से परफ़ॉर्मेंस में रुकावट आती है और फ़्रेम प्रति सेकंड (एफ़पीएस) कम हो जाता है.
सीपीयू को ऑप्टिमाइज़ करने के लिए, कोई सामान्य समाधान आम तौर पर असरदार नहीं होता. इसके बजाय, आपको गेम या सीन के हिसाब से सबसे ज़्यादा लोड वाले वर्कलोड की पहचान करनी होगी. इसके बाद, उससे जुड़े लॉजिक और फ़ंक्शन को ऑप्टिमाइज़ करना होगा.
गेम इंजन के टाइमिंग ट्रेस टूल
इस विश्लेषण में ये टूल आपकी मदद कर सकते हैं:
Unreal Insights
Unreal Engine प्रोजेक्ट में, Unreal Insight टूल की मदद से, फ़्रेम बनाने वाले अलग-अलग थ्रेड के लिए टाइमिंग ट्रेस की जानकारी का विश्लेषण किया जा सकता है.
उदाहरण के लिए, GameThread आम तौर पर सीपीयू के सबसे ज़्यादा समय का इस्तेमाल करता है. इसकी मुख्य वजह टिक टाइम है. इसके अलावा, FActorComponentTickFunction से जुड़े टास्क में Tick Time का ज़्यादातर हिस्सा खर्च होता है.
FActorComponentTick को ऑप्टिमाइज़ करने के लिए, यह ज़रूरी है कि कैमरे के फ़ील्ड ऑफ़ व्यू से बाहर मौजूद वर्णों और ऑब्जेक्ट के लिए, कैलकुलेशन को शामिल न किया जाए और कलिंग को लागू किया जाए. इसके अलावा, एलओडी (लेवल ऑफ़ डिटेल) पर आधारित ऐनिमेशन का इस्तेमाल करने से, परफ़ॉर्मेंस को और बेहतर बनाया जा सकता है.
Unity Profiler (Unity)
Unity Profiler का इस्तेमाल करके किए गए विश्लेषण से पता चलता है कि मुख्य थ्रेड 45 मि॰से॰ से ज़्यादा समय लेता है. इसमें PostLateUpdate.FinishFrameRendering 16.23 मि॰से॰ लेता है. इसलिए, यह सबसे ज़्यादा समय लेने वाला ऑपरेशन है. इसमें Inl_RenderCameraStack को कई बार कॉल किया गया है. हमारा सुझाव है कि आप यह पक्का करें कि चालू किए गए कैमरे ज़रूरी हैं या नहीं. साथ ही, उन्हें अपनी ज़रूरत के हिसाब से ऑप्टिमाइज़ करें.
सिस्टम-लेवल पर प्रोफ़ाइलिंग करने वाले टूल
प्रोफ़ाइलिंग के लिए इन टूल का इस्तेमाल करें:
Perfetto
Perfetto ट्रेस का इस्तेमाल करके, Android डिवाइस पर हर थ्रेड के लिए सीपीयू कोर असाइनमेंट और एक्ज़ीक्यूशन की जानकारी का पता लगाया जा सकता है. इससे थ्रेड के एक्ज़ीक्यूशन डेटा का विश्लेषण करके, परफ़ॉर्मेंस से जुड़ी समस्याओं का पता लगाया जा सकता है.
सीपीयू ओवरहेड केस
ट्रेस से पता चलता है कि GameThread और RenderThread पर वर्कलोड की वजह से, RHI Thread के QueuePresent में देरी हो रही है. इससे VSync के आधार पर, सीपीयू का इस्तेमाल ज़्यादा हो रहा है.
जीपीयू ओवरहेड केस
ट्रेस से पता चलता है कि जीपीयू को काम पूरा करने में 25 मि॰से॰ से ज़्यादा समय लगता है. इसका मतलब है कि जीपीयू पर ज़्यादा लोड है.
Simpleperf
सीपीयू का सबसे ज़्यादा इस्तेमाल करने वाले फ़ंक्शन का पता लगाने के लिए, simpleperf का इस्तेमाल किया जा सकता है. सबसे अच्छे नतीजे पाने के लिए, हमारा सुझाव है कि इन फ़ंक्शन को क्रम से लगाएं, ताकि सबसे ज़्यादा इस्तेमाल किए जाने वाले फ़ंक्शन को प्राथमिकता दी जा सके और उन्हें पहले ठीक किया जा सके.
Simpleperf की मदद से, उन फ़ंक्शन के बारे में डेटा की जांच की जा सकती है जो सीपीयू का सबसे ज़्यादा समय इस्तेमाल करते हैं. सीपीयू के इस्तेमाल को ऑप्टिमाइज़ करने के लिए, उन फ़ंक्शन से शुरुआत करें जो सबसे ज़्यादा सीपीयू का इस्तेमाल करते हैं. इस उदाहरण में, USkeletalMeshComponent सबसे ज़्यादा सीपीयू का इस्तेमाल करता है. यह ActorComponentTickFunctions में ऐनिमेशन से जुड़ा है.
GPU ऑप्टिमाइज़ेशन
अगर विश्लेषण से पता चलता है कि गेम जीपीयू पर निर्भर है, तो आगे की जांच करना ज़रूरी है. इसके लिए, जीपीयू को ऑप्टिमाइज़ करने और उसका विश्लेषण करने के लिए, अलग-अलग टूल और तकनीकों का इस्तेमाल करना ज़रूरी है.
जीपीयू को ऑप्टिमाइज़ करने के लिए, फ़्रेम डिबगर का इस्तेमाल करें. इससे हर सीन के लिए रेंडर पाइपलाइन और ड्रॉ कॉल का विश्लेषण किया जा सकता है. इसके अलावा, आपको GPU आर्किटेक्चर और पाइपलाइन के व्यवहार के बारे में पूरी जानकारी होनी चाहिए, ताकि गैर-ज़रूरी कार्रवाइयों या ऑप्टिमाइज़ करने के लिए क्षेत्रों की पहचान की जा सके.
नीचे दिए गए सेक्शन में, जीपीयू को ऑप्टिमाइज़ करने के तरीकों और टूल के बारे में बताया गया है.
ग़ैर-ज़रूरी RenderPasses हटाएं
रेंडरिंग की परफ़ॉर्मेंस को बेहतर बनाने और जीपीयू के वर्कलोड को कम करने के लिए, गैर-ज़रूरी रेंडर पास हटाएं. इनमें ऐसा कोई भी रेंडर पास शामिल है जिसमें ड्रॉ कॉल नहीं हैं या जिसका आउटपुट फ़ाइनल फ़्रेम में इस्तेमाल नहीं किया जाता है.
रेंडरिंग पाइपलाइन का विश्लेषण करने और ऑप्टिमाइज़ करने के अवसरों का पता लगाने के लिए, RenderDoc जैसे जीपीयू डीबगर का इस्तेमाल करें.
कोई ड्रॉ कॉल नहीं: देखें कि रेंडर पास में कोई ड्रॉ कॉल शामिल है या नहीं. अगर इसमें कोई ड्रॉ कॉल नहीं है, तो पास हटाएं.
इस्तेमाल नहीं किया गया आउटपुट: देखें कि क्या बाद के पास, रेंडर पास के आउटपुट को ऐक्सेस या डिसप्ले करते हैं. उदाहरण के लिए, रंग या डेप्थ. अगर ऐसा नहीं होता है, तो पास हटा दें.
मर्ज किए जा सकने वाले पास: उन पास की पहचान करें जिन्हें मर्ज किया जा सकता है:
- एक ही फ़्रेमबफ़र या अटैचमेंट
- लोड या स्टोर करने की कार्रवाइयां
- बीच में कोई डिपेंडेंसी बैरियर नहीं है
लोड या स्टोर करने की कार्रवाइयों को कम से कम करें
लोड या सेव करने की कार्रवाइयों में ज़्यादा संसाधनों की ज़रूरत होती है, क्योंकि इनमें बहुत ज़्यादा मेमोरी का इस्तेमाल होता है.
ज़रूरत न होने पर लोड-स्टोर ऑपरेशन कम करें. इन कार्रवाइयों को सिर्फ़ तब करें, जब RenderPass में अटैचमेंट की ज़रूरत हो. इसके अलावा, ओवरहेड को कम करने के लिए, उन्हें Clear या Don't care कार्रवाइयों से बदलें.
ऑप्टिमाइज़ करने का तरीका
रेंडरिंग पाइपलाइन का विश्लेषण करने के लिए, RenderDoc जैसे जीपीयू डीबगर का इस्तेमाल करें. साथ ही, ऑप्टिमाइज़ेशन के इन अवसरों का पता लगाएं:
लोड: अगर रेंडर पास अटैचमेंट, पिछले पास या अटैचमेंट से डेटा का इस्तेमाल नहीं करता है, तो लोड ऑपरेशन की ज़रूरत नहीं होती. ऐसे मामलों में,
Don't careयाClearका इस्तेमाल करने से, ओवरहेड कम किया जा सकता है.स्टोर: अगर मौजूदा रेंडर पास के बाद रेंडर पास अटैचमेंट का इस्तेमाल नहीं किया जाता है, तो स्टोर ऑपरेशन की ज़रूरत नहीं होती. ऐसे मामलों में,
Don't careयाClearमें से किसी एक का इस्तेमाल करें.बदलें: यह तय करें कि मौजूदा लोड या स्टोर सेटिंग को
ClearयाDon't Careसे बदला जा सकता है या नहीं. ऐसा करने पर, फ़ाइनल फ़्रेम पर कोई असर नहीं पड़ना चाहिए.
Early-Z को चालू करने के लिए, डिसकार्ड करने से बचें
अर्ली-ज़ेड, मोबाइल प्लैटफ़ॉर्म पर परफ़ॉर्मेंस को बेहतर बनाता है. हालांकि, शेडर में मौजूद discard
निर्देश, Early-Z को अपने-आप बंद कर देता है. अगर discard
निर्देश ज़रूरी नहीं है, तो उसे हटा दें.
Early-Z ऐक्सलरेशन
इस ऑप्टिमाइज़ेशन से, फ़्रैगमेंट शेडर ऑपरेशन काफ़ी कम हो जाते हैं और GPU की परफ़ॉर्मेंस बेहतर होती है.
अर्ली-ज़ेड डेप्थ और स्टेंसिल टेस्टिंग
ऑप्टिमाइज़ करने का तरीका
रेंडरिंग पाइपलाइन का विश्लेषण करने के लिए, RenderDoc जैसे जीपीयू डीबगर का इस्तेमाल करें. साथ ही, ऑप्टिमाइज़ेशन के इन अवसरों का पता लगाएं:
फ़्रैगमेंट शेडर में
discardका इस्तेमाल:discardकीवर्ड, जीपीयू को डेप्थ टेस्ट पहले से करने से रोकता है, क्योंकि फ़्रैगमेंट की विज़िबिलिटी के बारे में पहले से पता नहीं होता.gl_FragDepthमें बदलाव करना:gl_FragDepthमें डाइनैमिक तरीके से बदलाव करने पर, फ़्रैगमेंट की डेप्थ बदल जाती है. इससे Early-Z ऑप्टिमाइज़ेशन बंद हो जाता है, क्योंकि फ़्रैगमेंट प्रोसेसिंग से पहले फ़्रैगमेंट की फ़ाइनल डेप्थ का पता नहीं चलता.ऐल्फ़ा-टू-कवरेज चालू होने पर: ऐल्फ़ा-टू-कवरेज चालू होने पर (इसका इस्तेमाल अक्सर MSAA रेंडरिंग में किया जाता है), फ़्रैगमेंट कवरेज, ऐल्फ़ा वैल्यू पर निर्भर करता है. इससे डेप्थ टेस्टिंग में देरी हो सकती है और Early-Z बंद हो सकता है.
टेक्सचर फ़ॉर्मैट को ऑप्टिमाइज़ करना
टेक्सचर फ़ॉर्मैट का सही विकल्प चुनने से, मेमोरी की खपत कम होती है, बैंडविथ की क्षमता बढ़ती है, और रेंडरिंग की परफ़ॉर्मेंस बेहतर होती है. बहुत ज़्यादा सटीक फ़ॉर्मैट का इस्तेमाल करने से, जीपीयू के संसाधनों का इस्तेमाल हो सकता है. हालांकि, इससे विज़ुअल फ़ायदे नहीं मिलते.
ऑप्टिमाइज़ करने का तरीका
रेंडरिंग पाइपलाइन का विश्लेषण करने के लिए, RenderDoc जैसे जीपीयू डीबगर का इस्तेमाल करें. साथ ही, ऑप्टिमाइज़ेशन के इन अवसरों का पता लगाएं:
- डेप्थ-स्टेंसिल बफ़र के लिए,
D32S8के बजायD24S8का इस्तेमाल करें: डेप्थ-स्टेंसिल बफ़र के लिएD24S8का इस्तेमाल करने से,D32S8की तुलना में मेमोरी की खपत 20% कम हो जाती है. साथ ही, ज़्यादातर ऐप्लिकेशन में विज़ुअल क्वालिटी में कोई खास अंतर नहीं दिखता. - कलर टेक्सचर के लिए
ASTCकंप्रेस करने की सुविधा का इस्तेमाल करें:ASTCकंप्रेस करने की सुविधा से, टेक्सचर के लिए मेमोरी का इस्तेमाल काफ़ी कम हो जाता है. यह बिना कंप्रेस किए गए फ़ॉर्मैट की तुलना में, आठ गुना तक कम हो जाता है. साथ ही, इससे विज़ुअल क्वालिटी भी अच्छी बनी रहती है. - फ़ुल-फ़्लोट के बजाय हाफ़-फ़्लोट फ़ॉर्मैट का इस्तेमाल करें: मेमोरी बैंडविड्थ और स्टोरेज की खपत को कम करने के लिए,
R16FयाRG16Fका इस्तेमाल करें. ये फ़ॉर्मैट, पोस्ट-प्रोसेसिंग बफ़र के लिए सबसे सही होते हैं.
ज्यामिति की जटिलता को ऑप्टिमाइज़ करना
ज्यामितीय जटिलता को कम करने से, रेंडरिंग की परफ़ॉर्मेंस बेहतर होती है. खास तौर पर, कम जीपीयू क्षमता वाले मोबाइल डिवाइसों पर. इसमें वर्टेक्स और ट्राएंगल की संख्या कम करना, ड्रॉ कॉल कम करने के लिए ऑब्जेक्ट को एक साथ जोड़ना, और रेंडर न की गई या गैर-ज़रूरी ज्यामिति को हटाना शामिल है. मेश सिंपलिफ़िकेशन, लेवल ऑफ़ डिटेल (एलओडी), और फ़्रस्टम या ऑक्लूज़न कलिंग जैसी तकनीकों से, जीपीयू के लोड को काफ़ी हद तक कम किया जा सकता है. साथ ही, फ़्रेम रेट को बढ़ाया जा सकता है.
ऑप्टिमाइज़ करने का तरीका
ज्यामिति से जुड़ी परफ़ॉर्मेंस की समस्याओं का पता लगाने के लिए, प्रोफ़ाइलिंग टूल और जीपीयू डीबगर का इस्तेमाल करें. जैसे, RenderDoc, Android GPU Inspector या परफ़ॉर्मेंस का विश्लेषण करने वाले अन्य टूल.
ट्रायंगल की संख्या कम करें: पॉलीगॉन का इस्तेमाल कम करें. खास तौर पर, छोटे या दूर के ऑब्जेक्ट के लिए.
ज़्यादा जानकारी वाले लेवल (एलओडी) का इस्तेमाल करें: कैमरे की दूरी के आधार पर, आसान मेश का इस्तेमाल अपने-आप होता है.
छोटी मेश को मर्ज करें: स्टैटिक ऑब्जेक्ट को एक साथ जोड़ें, ताकि ड्रॉ कॉल और सीपीयू ओवरहेड कम हो सके.
फ़्रस्टम और ऑक्लूज़न कलिंग: ऐसे ऑब्जेक्ट रेंडर न करें जो व्यू से बाहर हैं या अन्य एलिमेंट की वजह से धुंधले दिख रहे हैं.
ग़ैर-ज़रूरी अटैचमेंट हटाना
रेंडर पास अटैचमेंट (जैसे कि रंग, डेप्थ, स्टेंसिल) मेमोरी बैंडविड्थ और GPU संसाधनों का इस्तेमाल करते हैं. भले ही, उनका इस्तेमाल न किया गया हो. ग़ैर-ज़रूरी या डुप्लीकेट अटैचमेंट हटाने से, परफ़ॉर्मेंस बेहतर होती है और बैटरी की खपत कम होती है. ऐसा खास तौर पर मोबाइल प्लैटफ़ॉर्म पर होता है.
ऑप्टिमाइज़ करने का तरीका
प्रोफ़ाइलिंग टूल और जीपीयू डीबगर का इस्तेमाल करें. जैसे, RenderDoc,
Android GPU Inspector या परफ़ॉर्मेंस का विश्लेषण करने वाले अन्य टूल. इनसे, ज्यामिति से जुड़ी परफ़ॉर्मेंस की समस्याओं का पता लगाया जा सकता है.
- इस्तेमाल की जांच करें: क्या कोई ड्रॉ कॉल या शेडर, अटैचमेंट में लिख रहा है या उससे पढ़ रहा है?
- फ़्रेम आउटपुट का विश्लेषण करें:
RenderDocया इसी तरह के अन्य टूल का इस्तेमाल करके, यह पता लगाएं कि अटैचमेंट से फ़ाइनल इमेज पर कोई असर पड़ा है या नहीं. - अस्थायी या डमी अटैचमेंट का इस्तेमाल करें: अस्थायी डेटा के लिए, अस्थायी अटैचमेंट या 'कोई फ़र्क़ नहीं पड़ता' स्टोर ऑपरेशन का इस्तेमाल किया जाना चाहिए. इसके लिए, स्थायी स्टोरेज की ज़रूरत नहीं होती.
शेडर की सटीक जानकारी को ऑप्टिमाइज़ करें
शेडर में बहुत ज़्यादा सटीक वैल्यू (उदाहरण के लिए, mediump या lowp के बजाय highp) का इस्तेमाल करने से, जीपीयू पर काम का बोझ, बिजली की खपत, और रजिस्टर प्रेशर बढ़ जाता है. ऐसा खास तौर पर मोबाइल जीपीयू पर होता है. वैरिएबल (जैसे, पोज़िशन, रंग, यूवी) के लिए सबसे कम सटीक वैल्यू का इस्तेमाल करके, परफ़ॉर्मेंस को बेहतर बनाया जा सकता है. इससे विज़ुअल पर कोई खास असर नहीं पड़ता.
ऑप्टिमाइज़ करने का तरीका
ज्यामिति से जुड़ी परफ़ॉर्मेंस की समस्याओं का पता लगाने के लिए, प्रोफ़ाइलिंग टूल और जीपीयू डीबगर का इस्तेमाल करें. जैसे, RenderDoc, Android GPU Inspector या परफ़ॉर्मेंस का विश्लेषण करने वाले अन्य टूल.
शेडर कोड की समीक्षा करें: शेडर वैरिएबल का आकलन करें और पुष्टि करें कि ज़्यादा सटीक वैल्यू का इस्तेमाल सिर्फ़ तब किया गया हो, जब ज़रूरी हो. जैसे, डेप्थ या स्क्रीन-स्पेस कंप्यूटेशन के लिए. उन रंगों, यूवी कोऑर्डिनेट या वैल्यू के लिए मीडियम या कम सटीक सेटिंग का इस्तेमाल करें जिनके लिए ज़्यादा सटीक सेटिंग की ज़रूरत नहीं होती.
GPU डीबगर का इस्तेमाल करें: डाइग्नोस्टिक्स यूटिलिटी, जैसे कि RenderDoc या मोबाइल GPU प्रोफ़ाइलर (उदाहरण के लिए, AGI, Mali/GPU Inspector). ये यूटिलिटी, रजिस्टर के ज़्यादा इस्तेमाल या सटीक जानकारी न देने से जुड़ी शेडर स्टॉल की पहचान करती हैं.
बैक-फ़ेस कलिंग की सुविधा चालू करना
ठोस ऑब्जेक्ट के लिए, कैमरे से दूर की ओर दिखने वाले ट्राएंगल (बैक-फ़ेस) को रेंडर करना अक्सर ज़रूरी नहीं होता.
ऑप्टिमाइज़ करने का तरीका
VK_CULL_MODE_NONE का इस्तेमाल करने से परफ़ॉर्मेंस पर बुरा असर पड़ सकता है, क्योंकि इससे GPU को आगे और पीछे, दोनों चेहरों को रेंडर करना पड़ता है. इससे रेंडरिंग का वर्कलोड बढ़ जाता है.
यूज़र इंटरफ़ेस (यूआई) सीन में ओवरड्रॉ को कम करना
रेंडरिंग की परफ़ॉर्मेंस को बेहतर बनाने और जीपीयू के वर्कलोड को कम करने के लिए, खास तौर पर यूज़र इंटरफ़ेस (यूआई) सीन में, ग़ैर-ज़रूरी ड्रॉ कॉल और रेंडर पास हटाएं. उदाहरण के लिए, यूज़र इंटरफ़ेस (यूआई) वाले किसी ऐसे सीन में जहां पूरी दुनिया को स्क्रीन पर यूज़र इंटरफ़ेस (यूआई) दिखाने से पहले रेंडर किया जाता है, वहां दुनिया को रेंडर करना ज़रूरी नहीं होता.
ऑप्टिमाइज़ करने का तरीका
रेंडरिंग पाइपलाइन का विश्लेषण करने के लिए, RenderDoc जैसे जीपीयू डीबगर का इस्तेमाल करें. साथ ही, ऑप्टिमाइज़ेशन के इन अवसरों का पता लगाएं:
- पुष्टि करें कि ज़रूरत से ज़्यादा ओवरड्रॉ न किया गया हो. यूज़र इंटरफ़ेस (यूआई) के कॉन्टेक्स्ट में, जहां पूरी स्क्रीन रेंडर हो सकती है वहां पुष्टि करें कि पहले के रेंडरिंग पास, ज़रूरत से ज़्यादा न हों.
- परफ़ॉर्मेंस को ऑप्टिमाइज़ करने के लिए, डेप्थ टेस्टिंग और कलिंग की सुविधा चालू करें.
- आगे से पीछे की ओर रेंडर करने के क्रम पर विचार करें.