मैं पेड़ों के प्रतिपादन के प्रदर्शन प्रभाव को कैसे कम कर सकता हूं?


24

मैं एक कम पाली शैली का खेल बना रहा हूं। मेरे पास कुछ पानी के साथ एक भूभाग है, और मुझे बहुत सारे और बहुत सारे पेड़ चाहिए; मेरे पास फिलहाल 10,000 पेड़ हैं। प्रत्येक पेड़ में 200 से अधिक त्रिकोण नहीं होते हैं, इसलिए वे बहुत अधिक कर नहीं हैं।

मुख्य समस्या है, झीलें हैं, और झीलें काफी बड़ी हैं। आप वास्तव में झील के दूसरी तरफ कोई भी पेड़ नहीं देख सकते हैं, और यह वास्तव में बुरा लग रहा है, खासकर जब आप वहां चलते हैं और पेड़ अचानक दिखाई देते हैं।

इसे ठीक करने के लिए, मुझे पेड़ की दूरी बढ़ानी होगी ताकि आप झील के दूसरी तरफ एक अच्छी मात्रा में पेड़ देख सकें, लेकिन इससे प्रदर्शन 40-50fps तक कम हो जाता है, और खेल में अभी तक शायद ही कुछ और हो। मैं एक GTX 1080 का उपयोग कर रहा हूँ, अगर वह मदद करता है।

मैं अपने खेल को और अधिक पेड़ों के साथ तेजी से चलाने के लिए क्या कर सकता हूं?


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

पेड़ आपको खिड़की से बाहर देखने के लिए आकर्षित कर रहे हैं, इस प्रकार आपके प्रदर्शन को कम कर रहे हैं।
mbomb007

क्या आपने प्रोफाइलर चलाने की कोशिश की है? यदि हां, तो अड़चन कहां है?
मिकेल होगस्ट्रॉम

क्या आप किसी भी तरह की कुंठा कुबूल कर रहे हैं?
क्रीथिक

फ्रोजन क्यूलिंग क्या है?
म्रत-माट

जवाबों:


43

ड्राइंग प्रदर्शन को बढ़ाने के लिए आप कुछ चीजें कर सकते हैं।

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

  2. क्या आपने बैचिंग को सक्षम किया है ? डायनेमिक बैचिंग आमतौर पर स्वचालित रूप से की जाती है यदि मेश की शीर्ष गिनती काफी कम हो। माता-पिता के गेमबॉज़ पर एकता संपादक में चेकबॉक्स की जांच करके पेड़ों को स्थिर बनाने के द्वारा स्टैटिक बैचिंग की भी कोशिश की जा सकती है। यह एनिमेटेड ऑब्जेक्ट के साथ अच्छी तरह से काम नहीं करता है। इस काम को करने के लिए आपको वस्तुओं को साझा करने की आवश्यकता है।

  3. कस्टम बैचिंग आपको एकता को संभालने देने के बजाए स्वयं विखंडन उत्पन्न करके रेंडरिंग को नियंत्रित करने देता है, और यह बड़ी जाली के लिए बैचिंग को भी सक्षम बनाता है। यह आसानी से Mesh.CombineMeshes द्वारा किया जाता है । यह भी एनिमेटेड वस्तुओं के साथ अच्छी तरह से काम नहीं करता है। इस काम को करने के लिए आपको वस्तुओं को साझा करने की आवश्यकता है। आप शायद अपनी दुनिया को किसी तरह के बंटवारे में विभाजित करना चाहते हैं और उन लोगों से बैच बना सकते हैं। उन विखंडों को कैसे उत्पन्न किया जाना चाहिए यह वास्तव में ऊपर है कि आपका कैमरा दुनिया में कैसे चलता है।

  4. शेड्स पर इंस्टेंसिंग सक्षम करें । इंस्टेंस केवल एक ड्रॉ कॉल के साथ कई ऑब्जेक्ट्स (एक ही जाल के साथ) को खींचने में सक्षम बनाता है। काम करने के लिए आपको साझा जाली और शेयर्ड शेयर्स की आवश्यकता है। सामग्री अलग-अलग हो सकती है, लेकिन shader को सभी अलग-अलग गुणों का समर्थन करना चाहिए।

    इंजन बनाने के लिए इंस्टेंटेड रेंडरिंग बैचेस को बेहतर बनाने के लिए, आप संभवतः उसी मेश को एक साथ सीन में ग्रुप करना चाहते हैं। इसके अलावा सामग्री रेंडर कतार से खेलने से आपको अच्छे परिणाम मिलेंगे यदि एक जाल में हमेशा एक ही सामग्री हो। विकास के दौरान जिस मोबाइल गेम पर मैं वर्तमान में काम कर रहा हूं, उसका उपयोग मैंने अपने परीक्षण दृश्य में आधे से अधिक ड्रॉकोल्स को कम करने के लिए किया था। इसके अलावा, क्योंकि एकता 5.6 सुनिश्चित करें कि आप Enable Instancingसामग्री में चेकबॉक्स की जांच करते हैं ।

  5. सामान्य रूप से अपने ड्रॉक्लस और सेटपास कॉल को बंद रखें। ये आपके GPU के लिए सामान खींचने के लिए कच्ची कॉल हैं, और उनके पास एक बड़ा ओवरहेड है। ड्राकॉल कम करना (जो कि बैचिंग और इंस्ट्रूमेंट कर रहा है) आपके सीपीयू द्वारा प्रदान किए जाने वाले समग्र प्रदर्शन को बढ़ा देगा क्योंकि इसे बहुत कम प्रतीक्षा करने की आवश्यकता होती है। सेटपास कॉल आपके वर्तमान शेडर्स में परिवर्तन होते हैं, इसलिए यदि आपके पास कई अलग-अलग सामग्री हैं, तो आपके पास कई सेटपास कॉल होंगे, जो सीपीयू को थोड़ा इंतजार करने का कारण बन रहे हैं।

  6. यदि आपका दृश्य विशाल है और आपका CPU समय दृश्य में सभी ऑब्जेक्ट्स के माध्यम से जा रहा है, तो दृश्य में ऑब्जेक्ट्स को कम करने का प्रयास करें। कुछ पेड़ों को सामूहिक रूप से रखने के बजाय समूहबद्ध करें और उन्हें एक ही वस्तु के रूप में रखें। यह भी सुनिश्चित करें कि आप पेड़ों या मूल वस्तुओं को नहीं हिला रहे हैं, क्योंकि यह कैश्ड रूपांतरों को त्यागने और पूरे दृश्य वृक्ष को फिर से जोड़ने के लिए एकता बनाता है।

  7. यदि आपका दृश्य बहुत बड़ा है और आपका CPU समय अभी भी अधिकतर वस्तुओं को रेंडर करने के लिए दृश्य ट्री के माध्यम से चलने वाली एकता में जाता है, तो एक चीज़ जो आप कर सकते हैं, वह है एकता को रेंडरिंग को संभालने नहीं देना। यदि आपके पास ड्रॉबल ऑब्जेक्ट्स को ट्रैक करने का एक बेहतर तरीका है, तो आप CommandBuffer.DrawMeshInstanced या Graphics.DrawMeshInstanced का उपयोग करके उन्हें हाथ से खींच सकते हैं। मैं इस बारे में बहुत विस्तार से नहीं जाऊंगा क्योंकि यह बहुत अधिक उन्नत है और इसमें अपने आप को और व्हाट्सएप को शामिल करना शामिल है।

यदि स्थैतिक या गतिशील बैचिंग ठीक से काम नहीं कर रही है (जिसे आप फ्रेम डिबगर की जांच करके देख सकते हैं), तो आपको यह सुनिश्चित करने की आवश्यकता है कि आप वास्तव में साझा सामग्री का उपयोग कर रहे हैं, और कॉलिंग के साथ दुर्घटना से सामग्री की प्रतियां नहीं बना रहे हैं meshRenderer.material। कॉलिंग .materialसे आपकी सामग्री की प्रतियां बन जाएंगी और बैचिंग टूट जाएगी। .sharedMaterialइसके बजाय उपयोग करें ।

यूनिटी 5.6 के बाद से आप फ़्रेम डिबगर का उपयोग यह निर्धारित करने के लिए कर सकते हैं कि कुछ ड्राकल्स पिछले ड्रॉक्ल्स के साथ बैच क्यों नहीं थे। यह आपके गेम की कमियों को कम करने की कोशिश करते समय वास्तव में सहायक होगा।

स्थैतिक / गतिशील / कस्टम बैचिंग पर निम्नलिखित फायदे हैं:

  • कम मेमोरी का उपयोग करता है क्योंकि मेमोरी में जाली को डुप्लिकेट नहीं करना पड़ता है
  • कई सामग्रियों का उपयोग कर सकते हैं, केवल साझा किए गए shader की आवश्यकता है
  • वस्तुएं एनिमेटेड हो सकती हैं

साथ ही एक नकारात्मक पहलू के रूप में यह एकता में नई विशेषता है और थोड़ा अस्थिर हो सकता है। इसके अलावा पुराने या मोबाइल डिवाइस जीपीयू जरूरी नहीं कि इंस्टेंस का समर्थन करते हैं।


1. हाँ, मैंने एलओडी की कोशिश की है, और मेरे आश्चर्य के लिए बहुत कुछ, यह वास्तव में इसे बदतर बना दिया। मेरे पास पेड़ों की 3 विविधताएं थीं, जिनमें से प्रत्येक में एक छोटी सी निचली गिनती होती है, और उस पर पेड़ की एक छवि के साथ एक सपाट विमान होता है।
श्री-मैट

2. मेरे सभी पेड़ स्थिर के रूप में चिह्नित हैं। जहाँ तक मुझे पता है कि बैचिंग सक्षम करता है? क्या वो सही है? और जब आप साझा सामग्री कहते हैं, तो क्या आपका मतलब केवल यह है कि पेड़ों में समान सामग्री है?
श्री-मैट

3. यह वास्तव में किस तरह के प्रदर्शन में सुधार करेगा? क्या यह कोशिश करने लायक है?
श्री-मैट

1
2/3: मेरे अनुभव में यूनिटी डायनेमिक बैचिंग में बहुत अच्छा काम नहीं करती है और स्टैटिक बैचिंग बिल्ड साइज को बढ़ाती है, इसलिए मैंने बैचिंग को खुद लागू किया और लोड-टाइम को जोड़ते हुए मेष किया। इस तकनीक का उपयोग करके मैं लगभग 300 ड्रॉक्ल्स को संपीड़ित करने के लिए 2500 ड्रॉक्ल्स बनाने में कामयाब रहा जो हमारे मोबाइल गेम के लिए महत्वपूर्ण था जहां ड्रॉकोल्स महत्वपूर्ण हैं। इसने (ऑफस्क्रीन) गणना करने के लिए अनावश्यक रूप से बहुत कम चक्कर लगाए लेकिन यह इसके लायक था।
लास

2
tfw जब आप पेड़ों के साथ खराब प्रदर्शन के बारे में एक सवाल पढ़ते हैं और बिलबोर्डिंग के बारे में एक भी शब्द नहीं खोया है
Num Lock

13

ठीक है, तो समस्या बस यह थी कि मैं पूर्व-संगणित रीयलटाइम जीआई का उपयोग नहीं कर रहा था। मैं थोड़ी देर पहले जांच करता हूं लेकिन इसका तत्काल प्रभाव नहीं पड़ा, इसलिए मैंने इसे छोड़ दिया और इसके बारे में भूल गया, और प्रकाश प्रसंस्करण का समय बहुत लंबा था। हालाँकि, इसने इसे संसाधित करना समाप्त कर दिया है, और मेरा शब्द, मेरा एफपीएस 3x से उछल गया है। तो अब के लिए, मैं इसे उस पर छोड़ दूंगा और भविष्य में यह सुनिश्चित करूँगा कि मैं हमेशा प्रीकम्प्यूटर रियलटाइम जीआई का उपयोग कर रहा हूँ!

अगर अभी भी कुछ और है जो मैं प्रदर्शन को और बेहतर बनाने के लिए कर सकता हूं, तो कृपया मुझे बताएं, मैं सबसे आभारी रहूंगा!


2
समावेशन कलिंग का उपयोग करें, भले ही आपका दृश्य बड़ा हो - इसे विखंडू में विभाजित करने पर विचार करें, उदाहरण के लिए कई भूभाग और उन्हें लोड और अनलोड करना।
उम्मीदवार चंद्रमा _Max_

यह देखते हुए कि आपको अपनी समस्या हल हो गई है, आपको शायद इस उत्तर को स्वीकार करना चाहिए।
गनीमॉक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.