لقد قضيت وقتًا غير محدود من الوقت في تحسين واجهة المستخدم في الوحدة. ولكن من أجل التسبب في تثبيط ، يكفي تعديل بسيط للسمة الصغيرة لعنصر واجهة المستخدم غير المرئية تقريبًا. وعندما يحدث ذلك ، لن يخلصك نظام Unity UI من خفض معدلات FPS. هل أنت مستعد لإصلاح الخلل الطويل؟هذا هو بالضبط ما حدث في مشروعي الأخير ...عملت بجد لتحسين العديد من لوحات واجهة المستخدم في ميناء لعبتنا على
Oculus Quest . في الأساس ، كانت المهمة هي تقليل مستوى السحب الزائد إلى قيم مقبولة حتى يتمكن GPU من التعامل مع أهم شيء - العرض ثلاثي الأبعاد الحقيقي.
لذلك عملت على تحسين واجهة المستخدم لمدة شهر واحد على الأقل ، وفي النهاية حققت تقدماً جيدًا.
في مرحلة ما ، أصبحت واجهة المستخدم محسّنة لدرجة أنها بالكاد أثرت على توقيت GPU. تم تعويض تقنيات التعتيم الخاصة بواجهة المستخدم غير الشفافة التي طبقتها لمعظم عمليات إعادة الرسم التي تسببها طبقات واجهة المستخدم (العناصر المرسومة أعلى العناصر الأخرى).
لذلك ، حصلت على نظام واجهة مستخدم هجين محسّن للغاية ، والذي تداخل بشكل أساسي مع العناصر ثلاثية الأبعاد المرسومة تحته. لقد أصبح من السهل للغاية تجاهل عرض هذه الأجزاء المتداخلة.
ومع ذلك ، كان العمل لا يزال بعيدا عن الاكتمال ...عندما قمت بتوصيل
Unity UI Profiler ، لفت انتباهي شيء واحد.
رأيت أن وحدة المعالجة المركزية التي تم تحميلها بشكل زائد تنفق أكثر من
1 مللي ثانية في كل إطار على تقديم واجهة المستخدم. هذا كثير من الوقت للمنصة التي تمنحك ميزانية قدرها
13 مللي ثانية للعبة بأكملها: الفيزياء والمنطق والعرض ثلاثي الأبعاد والإدخال و VR ورمز الشبكة.
وبعد كل ذلك كانت هناك حالات عندما "قتل" واجهة المستخدم أداء وحدة المعالجة المركزية أكثر.
الوحدة UI: بناء دفعات مكلفةوهذا يقول شيئًا واحدًا:
يمكن تحسين واجهة المستخدم لجرافيك ، ولكن هذا لا يعني بالضرورة تحسين وحدة المعالجة المركزية .
في الواقع ، عند تقديم Unity UI ، تكون مهام CPU و GPU مختلفة تمامًا. ليس من المستغرب أن أوصي بالاقتراب من وحدة المعالجة المركزية وتحسين الجرافيك بشكل مختلف ، وقد نوقش هذا في مشاركتي السابقة حول
تحسين واجهة المستخدم في الوحدة .
كشفت المزيد من التنميط عن الوحدة UI مشكلة واضحة: تم إعادة إنشاء واجهة المستخدم باستمرار في كل إطار جديد ، أي
تم إعادة بناء Canvas (Canvas Rebuild) في كل إطار .
تحميل ثابت على وحدة المعالجة المركزية لمدة
1 مللي ثانية ... أوه ، أوه.
ولكن لماذا الوحدة تفعل هذا بي؟ اعتقدت أن الوحدة تقوم بتخزين جميع واجهات Canvas ...في الواقع نعم ، هو عليه. وحدة التخزين المؤقت بشكل فعال قماش بحيث يتم جمعها مرة واحدة فقط.
ومع ذلك ، فإن المشكلة تنشأ عندما تقوم بتغيير خصائص أي من عناصر واجهة المستخدم في Canvas - اللون ، الموضع ، وهلم جرا.
هذا هو ، كل الرسوم المتحركة التي نحبها ، على سبيل المثال ، تأثيرات الأزرار عندما تحوم ، تقتل الإنتاجية ، وربما لا تعرف ذلك.
عند حدوث تغيير في خاصية واجهة المستخدم ، تدير Unity لوحة Canvas Rebuild الشهيرة ، التي تدمر أداء اللعبة .
يفرض The Canvas Rebuild الخاص بالواجهة محرك الوحدة على اجتياز جميع عناصر واجهة المستخدم في لوحة الرسم التكرارية هذه لإنشاء قائمة محسنة لمكالمات السحب (رؤوس متعددة ، ألوان ، مواد ، إلخ) وتستغرق عملية Canvas Rebuild وقتًا أطول مما يستغرقه
Seat Panda من الصفر إلى 60 ميل في الساعة .
مع إدراك أننا نعاني باستمرار من Canvas Rebuild ، سيكون من المنطقي طرح سؤال ...
لماذا نعاني من Canvas Rebuilds وما الذي يمكن عمله حيال ذلك؟للإجابة على هذا السؤال البسيط ، كان علي قضاء أكثر من 5 ساعات في دراسة الموضوع والعمل مع
Unity UI Profiler .
هيا بنا
1. التوصيف الوحدة UI: كل شيء على ما يرام ، الآن ...
تخيل أن لدينا واجهة مستخدم بسيطة.
لا تفعل واجهة المستخدم هذه شيئًا ، فهي تظهر فقط على الشاشة وتزعج اللاعب الذي يحاول رؤية شيء ما من خلاله.
كمجموعة من 350+ صورة في Grid Layout Group ، يبدو كما يلي:
مثال عن الوحدة في واجهة المستخدموكل شيء على ما يرام ، على الرغم من الصور الغريبة 350. في الحالة القياسية ، ستعرض واجهة المستخدم في مكالمات السحب اثنين فقط ، لأنه لا يوجد سوى اثنين من الصور الفريدة في ذلك ليست في أطلس العفريت.
في الواقع ، في الملف التعريفي ، أستطيع أن أرى أنه لا يوجد حمل عمليًا من جانب وحدة المعالجة المركزية.
معظم الوقت الذي تقضيه في واجهة المستخدم أقل من
0.01 مللي ثانية ، وهو أمر جيد للغاية.
الوحدة UI التنميط: طفرة غامضة(... معظم الوقت)انتظر ، من أين جاءت هذه الزيادة في موارد وحدة المعالجة المركزية في نهاية الرسم البياني؟2. الوحدة UI التنميط: إعادة بناء قماش المفاجئ!
ماذا حدث في نهاية ملف الوحدة؟ غريب للغاية ، في ثانية واحدة فقط ، كانت وحدة المعالجة المركزية في وحدة واجهة المستخدم أكثر من ضعف ذلك.
اريد ان العب لعبةابحث عن الاختلافين في الأمثلة أدناه
(قد تضطر إلى فتح الصور في نافذة منفصلة لرؤية أفضل) .
الوحدة UI Profiling: قماش منخفض التكلفةالوحدة UI Profiling: Canvas Rebuildأنا أعطيك خمس ثوان لمعرفة ذلك.
5 ، 4 ... حسنًا ، إليك نصيحة لتبسيط المهمة:الوحدة UI Profiling: Overhead Canvas Rebuildنجاح باهر!PostLateUpdate.UpdateRectTransform
و
UGUI.Rendering.UpdateBatches
أن تصبح النجوم الرئيسية لهذا العرض.
ماذا تفعل هذه المناطق؟
الأول ،
UpdateRectTransform
، يوضح أن تحويل بعض الكائنات قد تغير ، وبالتالي يتعين على Unity تنفيذ منطق مكلف لعكس التغييرات المرئية. نحن لا نعرف ما إذا كان هذا هو موضع أو تدوير أو مقياس أو بعض خصائص
RectTransform
.
الجحيم ، لا نعرف حتى ما إذا كانت سمة واحدة فقط أم كلها دفعة واحدة. هل كان كائن واحد أو عدة؟ وأي منها؟
هذه هي المشكلة: نحن لا نعرف .
تتعلق القطعة الثانية باهظة الثمن ،
UpdateBatches
، بالحاجة إلى إعادة بناء هندسة Canvas بأكملها. هذه العملية تسمى
Canvas Rebuild . يعني Rebuilding Canvas أن الوحدة تدور حول التسلسل الهرمي Canvas بالكامل لإنشاء قائمة بمكالمات السحب. يتم احتساب الرؤوس والمؤشرات والألوان والأشعة فوق البنفسجية لجميع العناصر ، ثم يتم تنفيذ تمريرة للجمع بين أقصى عدد ممكن من مكالمات السحب لتقليل الحمل الزائد على وحدة المعالجة المركزية ، والذي ينقله إلى برنامج تشغيل الرسومات.
الآن يبدو أننا نعرف ما يحدث وعلى المسار الصحيح. ولكن كيف يمكن تجنب إصلاح هذا القماش؟ ما الذي يسبب لهم؟
نحن بحاجة إلى مزيد من المعلومات المحددة ...
لتلخيص- يؤدي تغيير سمة في عنصر واجهة المستخدم إلى تمييز العنصر نفسه على أنه سيئ
- يمكن أن يكون عنصر واجهة المستخدم متسخًا تمامًا ، ولكن يمكن أيضًا أن يكون جزئيًا: أسطح متسخة ، تخطيط متسخ ، مواد متسخة. من الأسهل التعافي من الحالات المتسخة جزئيًا
- بمجرد أن يتم تمييز أي عناصر Canvas على أنها متسخة ، تقوم الوحدة بإعادة بنائها تمامًا
- تعتبر عمليات إعادة بناء اللوحات غالية الثمن بالنسبة لوحدة المعالجة المركزية ، لذلك فإن أهم شيء يجب تجنبه هو
3. البحث عن الآفة: وسيلة غير صحيحة سياسيا للقوة الغاشمة
ما زلنا بحاجة للإجابة على السؤال التالي:
ما الذي يسبب هذه إعادة بناء قماش؟اتضح أنه لا توجد طريقة
سريعة لمعرفة ذلك ، لا سيما مع التسلسل الهرمي Canvas الكبير.
لكن أولاً ، سأريكم
طريقة القوة الغاشمة لإيجاد سبب لـ Canvas Rebuild .
1. دع Unity UI Profiler يواصل التسجيلسنقوم بتصفية المقاييس حتى نتمكن من التركيز على الأكثر أهمية: التقديم والنصوص وواجهة المستخدم.
تتبع العلامة الأولية لفهم تكاليف النظام الحالي ، والتي ينبغي أن تشمل لوحة قماش مكلفة.
2. قم بإلغاء تنشيط كائنات اللعبة من واجهة المستخدم وقارن بين القراءاتحدد مجموعة كائنات اللعبة وقم بإلغاء تنشيطها.
مقارنة مقاييس الأداء.
إذا لم تتحسن القراءات كثيرًا ، فاستمر في إلغاء تنشيط كائنات اللعبة حتى ترى تحسنًا كبيرًا.
3. العثور على ما يغير خصائصهتمكنا من تحديد الكائن الذي يستدعي Canvas Rebuild. ولكن ما الذي يجعل قضيتهم بالضبط؟
ربما يتغير حجمها من خلال البرنامج النصي؟ أم أن موقفه يتغير من الرسوم المتحركة؟
سيكون من المناسب النقر بزر الماوس الأيمن فوق
RectTransform وتحديد "
Find References in Scene "
عندما تكتشف أسباب إعادة بناء Canvas ، قم بعمل شيء حيال ذلك ، على سبيل المثال ، قم بإيقاف تشغيل الرسوم المتحركة أو التحويلات.
روبن ، ولكن كيف يمكنني استخدام هذه الطريقة مع تسلسل هرمي ضخم من واجهة المستخدم؟ لا تقل لي هراءقلت إن العملية لن تكون سريعة أو مثيرة للاهتمام ، لكن اللاعبين سيكونون ممتنين لك.
هذه هي النقطة. أولاً ، ليس وجود تسلسل هرمي ضخم وضعا مثاليا. هذا التسلسل الهرمي الضخمة والعميقة التي تجعل Canvas Rebuild مكلفة للغاية بالنسبة لوحدة المعالجة المركزية.
لكن التسلسلات الهرمية الكبيرة والمتداخلة لواجهة المستخدم يمكن أن تنشأ (وسوف) ، لذلك توقع أن تصل لوحة Canvas Rebuild إلى أهم شيء هو اللعبة.
على الرغم من أن طريقة القوة الغاشمة تساعد في العثور على مصدر إصلاح Canvas ، إلا أنها لا تتطور بشكل جيد على المدى الطويل.
بعد أن أصبحت أكثر احترافًا في تحسين واجهة المستخدم ، قمت بإنشاء أداة توفر جميع الإجابات التي أحتاجها حتى يلبي المشروع توقعات اللاعبين ...
التنميط قماش إعادة بناء4. المكافأة: تعزيز ميزات تحسين الوحدة منشئ ملفات التعريف UI
آمل أن تكون قد فهمت بالفعل مدى تواتر وتكرار إزعاج Canvas Rebuild.
هذه البيريسترويكا ، التي أصابت لعبتي ، أخذت ما يصل إلى 10٪ من ميزانية وحدة المعالجة المركزية بأكملها!
كما رأينا ، هناك طريقة القوة الغاشمة لإيجاد مصادر Canvas Rebuild. ربما يمكنك التعامل معهم باستخدام الاستراتيجيات المدرجة في مشاركتي حول
تحسين Unity UI .
لكن مثل هذه العملية المعرضة للخطأ لن ترضي أبدًا المعلم الحقيقي. يمكنك قضاء بضعة أيام تكافح مع Canvas Rebuild ، ولكن في أكثر اللحظات غير المتوقعة سيعودون إلى الاختفاء بمجرد التوصيل في Unity UI Profiler.
إذا كنت تقوم بتطوير لعبة لـ VR ، يصبح هذا أمرًا بالغ الأهمية. لا نريد إعادة بناء Canvas في واجهة المستخدم الخاصة بالفضاء العالمي. إذا لم تتمكن من التخلص من البيريسترويكا ، فلن يحتمل أن يقف لاعبوك على الأرجح.
حسنا ، أحصل على فكرة التخلص من Canvas Rebuilds. لكن Unity Profiler لا تقدم أي معلومات عنها تقريبًا! ماذا يمكنك أن تنصح؟سعيد سألت. اتضح أنه
يمكننا إقناع Unity Profiler بتزويدنا بمعلومات مفيدة حول ما يعيق أداء واجهة المستخدم .
يمكننا تمديد وظائف
Unity UI Profiler . للقيام بذلك ، تحتاج إلى تعديل التعليمات البرمجية المصدر Unity UI المتاحة للجمهور.
بمجرد وصولك إلى الكود المصدري ، ستحتاج إلى
العثور على وظائف الكود التي تحدث فيها عمليات إعادة بناء اللوحات القماشية . نحتاج بعد ذلك إلى واجهة برمجة التطبيقات (API) السحرية باستخدام
أداة التعريف BeginSample و
EndSampleإذا كنت تقوم بتشغيل Unity 2019.1 أو إصدار سابق ، فقد تم تحميل شفرة مصدر Unity UI إلى
مستودع Bitbucket . يوجد أيضًا دليل للتنزيل والتثبيت والتعديل.
ماذا أنصح؟ استخدم إصدارًا أحدث من Unity ، ليس أقل من 2019.2.0.
تأتي الإصدارات الأحدث من الوحدة افتراضيًا مع واجهة المستخدم المصدر ، لأن نظام واجهة المستخدم أصبح الآن جزءًا من مدير الحزم. هذه هي الطريقة الأكثر خالية من المتاعب.
فيما يلي قائمة بالكودات التي اكتشفتها خلال بحثي حيث يمكنني إضافة مكالمات Profiling API:
الوحدة UI: مصدر التوصيفهل هو مفيد؟ نعم.
مريحة للفنان / مصمم؟ لا.
كان الشاعر هو الذي
كتب امتداد الوحدة الصغيرة المفتوحة المصدر الذي يمتد من إمكانيات Unity Profiler .
ستتيح لنا هذه الأداة المجانية التبديل بسرعة بين أوضاع التنميط المختلفة لضمان أقصى أداء للعبة.
ما هو أفضل شيء في موسع Unity Profiler؟ إنه يعمل خارج المحرر ، مما يخفف من حدة كل الصداع عند تحديد واجهة مستخدم لنظام Android ومنصات أخرى.
ومن هنا ، يتم التحكم في كل قوتها بواسطة زرين فقط:
- برتقالي بلدي بروفيل
- Nerf بلدي الوحدة التعريف .
يمكنك الحصول على هذه الأداة
هنا .