المقدمة
عندما نصنع الألعاب ، غالبًا ما نتجاهل أحد أهم جوانب تطوير اللعبة - التحسين. نتيجة لذلك ، نحصل على تأخيرات وانخفاض FPS (أحيانًا حتى على الأجهزة المتطورة ، إذا كان كل شيء يعمل بالفعل). سيرى معظم الأشخاص دائمًا تحسين اللعبة كخطوة أخيرة ، وهذا هو الخطأ الأول - يجب أن يكون دائمًا العنصر الأول في القائمة.
من المستحيل المبالغة في تقدير هذه العادة مع كل تصميم ، كل يوم عندما تضيف ميكانيكيًا جديدًا أو إعداد إضاءة جديدًا ، أو أي أنظمة قائمة على الفيزياء لألعابك ، تحقق دائمًا من التصميم لمعرفة ما إذا كانت هناك أي مشكلات في الأداء بسبب هذه التغيير هو ممارسة جيدة لتطوير اللعبة.
إذا لم تأخذ الوقت الكافي لتحسين الأداء منذ بداية المشروع ، فقد ينتهي بك الأمر في مشكلة بالنسبة لك ولعبتك في المراحل النهائية. أريد هنا أن أشارككم بعض الأفكار والنصائح حول كيفية تحسين أداء لعبتكم بناءً على بعض الدروس العملية التي تعلمتها من أخطائي خلال السنوات الخمس الماضية.
ملف تعريف لعبتك
يعد ملف التعريف هو الأول في القائمة وواحد من أدواتي المفضلة على الإطلاق في Unity لمراقبة أداء اللعبة لمعرفة السبب الحقيقي وراء مشكلات الأداء. إنه مفيد جدًا للحصول على فهم تفصيلي لكيفية استجابة لعبتك للتغييرات المختلفة في المحرر.
يمكنك العثور على Profiler في Window-> Analysis-> Profiler ،
فهو يعرض فئات مثل استخدام وحدة المعالجة المركزية ووحدة معالجة الرسومات ، والعرض ، والفيزياء ، والصوت ، والمزيد. لا يمكننا الاعتماد على التنميط في المحرر (Editor Profiling) ، حيث يؤثر المحرر على أداء المشروع أثناء الاختبار ، ويمكن أن يؤثر ذلك على صحة معلومات التوصيف. من الأفضل إنشاء بنية منفصلة للحصول على بيانات تعريف دقيقة.
التنميط عن بعد
لجعله يعمل ، تحتاج إلى تثبيت Android SDK وتوصيل JDK وتصحيح أخطاء USB. تذكر أنه من الجيد دائمًا اختبار أداء لعبتك عندما يتعلق الأمر بالميكانيكا وتوسيع واجهة المستخدم وما إلى ذلك. ناهيك عن اختبار أداء اللعبة الحقيقي إلى جانب ما سبق. لاختبار الأداء الفعلي للعبة ، تحتاج إلى إنشاء بنية تعريف مخصصة.
لتوصيل Remote Profiler ، انتقل إلى Edit> Project Settings> Editor وضمن الجهاز حدد أي جهاز Android.
بناء التنميط
للتأكد من أن Unity لديها حق الوصول إلى التصميم الخاص بك الذي يمكن وصفه ، يجب عليك تمكين "بناء التطوير أو دعم التوصيف العميق" و "الاتصال التلقائي لملف التعريف" في إعدادات البناء قبل إنشائه. يتيح ذلك لمحرر الوحدة ربط جهازك تلقائيًا.
عندما يكون عرض التسعير الخاص بك جاهزًا ، افتح اللعبة دون إغلاق نافذة Unity Profiler. ستعرض الوحدة الآن تلقائيًا بيانات الأداء للبناء الحالي للعبة في نافذة التعريف.
يمكنك معرفة المزيد عن ملف التعريف هنا .
GameObjects الخلط
Batching هي تقنية جيدة جدًا لتحسين الأداء عن طريق تقليل عدد مكالمات Draw ، والتي تقوم بتجميع عرض العديد من كائنات GameObject المتشابهة في مكالمة سحب واحدة. هناك نوعان من طرق التجميع: ثابت وديناميكي. هناك بعض القيود على التجميع - لا يمكننا تجميع الشبكات والأقمشة وبعض مكونات التجسيد.
التجميع الثابت
يتم استخدام التجميع الثابت عندما تكون كائنات GameObjects ثابتة. يجب ألا تتحرك كائنات GameObject الثابتة هذه أو تحجيمها أو تدويرها ، ويجب أن تستخدم نفس المادة لجميع كائنات GameObject الثابتة حتى تعمل على دفعات.
إذا كانت GameObjects الخاصة بك لا تتفاعل مع اللاعب الخاص بك ، أو إذا لم تقم بتغيير التحويل ، فمن الأفضل استخدام التجميع الثابت لمعظم البيئات في لعبتك ، مثل المباني والطرق وما إلى ذلك.
الخلط الديناميكي
يشبه التجميع الديناميكي الثابت في أن كائنات GameObjects يجب أن تستخدم نفس المواد ، ولكن يمكنها تجميع الكائنات المتحركة دون الحاجة إلى جعلها ثابتة. بشكل أساسي ، يمكن للوحدة تحميل GameObjects تلقائيًا في نفس استدعاء السحب إذا كانوا يستخدمون نفس المادة ، لكن لديهم بعض قيود التجميع الديناميكية المفروضة عليهم وفقًا للوحدة:
- تحتوي كائنات GameObject الديناميكية المجمعة على مقدار حمل معين لكل رأس ، لذلك يتم تطبيق التجميع فقط على الشبكات التي لا يزيد عدد رؤوسها عن 300 نقطة ولا تزيد عن 900 سمة قمة.
- Shader Vertex Position, Normal UV, 300 , Shader Vertex Position, Normal, UV0, UV1 Tangent, 180 .
- : .
- GameObject- , transform (, GameObject A +1 GameObject B –1 ).
- Material , GameObject- , . Shadow Caster.
- : / . , GameObject- .
- Multi-pass .
- Unity , . « » .
- Legacy Deferred ( ) , GameObject .
يعمل التجميع الديناميكي بشكل مختلف لأنظمة الجسيمات وخطوط العرض وعرض الممر عن الشبكات.
- لكل نوع عارض متوافق ، تجمع Unity كل محتوى الدُفعات في 1 Vertex Buffer كبير.
- يقوم العارض بتعيين حالة مادة الدُفعات.
- تقوم الوحدة بربط Vertex Buffer بجهاز الرسوميات.
- لكل عارض في الدُفعة ، تقوم Unity بتحديث الإزاحة في Vertex Buffer ثم ترسل استدعاء سحب جديد.
هناك طرق أخرى لتحسين التجميع باستخدام بعض الأصول من Assetstore مثل Simple Mesh Combine أو Bakery أو يمكننا أيضًا استخدامها
Mesh.CombineMeshesلدمج شبكات متعددة في شبكة واحدة ، وهو أمر مثالي لتحسين الأداء.
اخبز الإضاءة الخاصة بك
بشكل تقريبي ، هناك ثلاثة أوضاع للإضاءة: Realtime و Baked و Mixed.
الوقت الحقيقي هو الأفضل ولكن عليك أن تدفع ثمنه بالأداء. إنه يجلب الضوء المباشر إلى المشهد ويقوم بتحديث كل إطار مع تحرك الأضواء وكائنات اللعبة داخل المشهد ، وتحديث الإضاءة على الفور.
عندما يكون لديك خيار خبز الإضاءة على خشبة المسرح ، تأكد من استخدامه لأنه مثالي لتحقيق مكاسب في الإنتاجية ، خاصة إذا كنت تستهدف الأجهزة المحمولة. من الأفضل دائمًا استخدام الإضاءة المنخفضة على المسرح لتحقيق المظهر المطلوب.
بهذه الطريقة ، سيتم حساب جميع الأضواء الخاصة بك مسبقًا في وضع عدم الاتصال في عملية تسمى Lightmap Baking. عندما تقوم بتعيين العلم الثابت لـ GameObject Lightmap ، فإن Unity يخبز معلومات حول GameObject Light والظلال والأضواء المرتدة والظلال الناعمة إلى مواد تلامس المشهد الخاص بك. ومع ذلك ، فإن Lightmap بها بعض القيود ، فلا يمكن تحديث الإضاءة ديناميكيًا للكائنات التي تحددها باستخدام Lightmap Static Flag.
لقد صنعت مشهدًا لـ SCIFI قبل بضعة أشهر في وقت فراغي وأعتقد أن هذا هو أفضل مثال على كيفية عمل الإضاءة المخبوزة. بالطبع استخدمت Emission.
إذا كان أي شخص مهتمًا بإلقاء نظرة عامة على كيفية إنشاء مشهد SCIFI وكيف حققت هذا المظهر ، فأخبرني ، ربما يمكنني تخصيص مقال منفصل لهذا.
, !
هذه طريقة جيدة جدًا لتحسين أداء لعبتك مع انسداد الوحدة. بشكل عام ، يعني استبعاد الانسداد أن الوحدة لن تعرض كائنات GameObject المخفية تمامًا من منظور الكاميرا (المحجوبة) بواسطة كائنات GameObject الأخرى.
لفتح نافذة الانسداد ، انتقل إلى Window-> Rendering-> Occlusion Culling.
إذا كان أي شخص مهتمًا بكيفية تحقيق هذا المظهر في مشهد الغابة الغامضة ، فأخبرني ، ربما يمكنني كتابة مقال منفصل حول هذا الموضوع.
إليك مقطع فيديو إذا كنت مهتمًا!
twitter.com/i/status/1096336962259021824
بشكل افتراضي ، تقوم Unity بتطبيق Frustum Culling ، مما يعني أنها تعرض فقط خط رؤية الكاميرا ، وتعرض جميع الكائنات. على سبيل المثال ، إذا كانت الكاميرا تنظر إلى الحائط ، فسيتم أيضًا عرض جميع الكائنات الموجودة خلف هذا الجدار. لسنا بحاجة إلى هذا على الإطلاق ، لذلك نحن بحاجة إلى إضافة الانسداد Culling إلى مشهدنا.
هذا هو السبب في أننا يجب أن نستخدم Occlusion Culling ، مما يعني أن الكاميرا ستعرض الجدار فقط بدون وجود أي أشياء خلفه.
اقرأ أكثر: