نادرًا ما يُقتَل الغطاء النباتي الكثيف بعدد المثلثات وحده، بل يموت بألف draw call، وoverdraw من بطاقات ألفا متهاونة، وظلالٍ لم يتذكّر أحد أنها ما زالت مُشغّلة. أنفِق جهدك بهذا الترتيب: الـinstancing أولًا، مسافات الـcull ثانيًا، الظلال ثالثًا، الـLOD رابعًا، وضع الكثافة خامسًا، وتحقّق من كل خطوة بالكاميرا الثابتة نفسها، متغيّرًا واحدًا في المرة، وإلا لن تتعلّم شيئًا. يغطّي هذا الدليل كل مرحلة بتوقيع المُنمِّط الذي يخبرك أنها مشكلتك.
تُرسَم الغابة الحقيقية "مجانًا" لأن الفيزياء متوازية على نطاق هائل. تستطيع بطاقتك الرسومية تزييف المظهر عند 60 fps، لكن فقط إن توقّفت عن هزيمة الآلية التي تشحنها المحرّكات أصلًا لهذه المهمة بالذات.
النموذج الذهني: خمسة عنق زجاجة، ترتيب واحد
أداء الغطاء النباتي ليس مشكلة واحدة بل خمسًا، وتهيمن بتسلسل يمكن التنبّؤ به. الـdraw call تربط الـCPU أولًا؛ ومسافة الـcull تقرّر كم تطلب أصلًا من الـGPU أن يرسم؛ والظلال تضاعف بصمت كلفة كل ما يلقيها؛ والـLOD والـoverdraw يحكمان الفاتورة لكل بكسل؛ ووضع الكثافة يقرّر كم من كل ذلك احتجت فعلًا. هاجمها بترتيب خاطئ فتُحسّن شيئًا لم يكن عنق الزجاجة. الترتيب أدناه هو الترتيب الذي تعضّ فيه الكلفة فعلًا.
الـinstancing أولًا، وكل شيء آخر ثانيًا
شجرة واحدة مرسومة 5000 مرة أرخص جذريًا من 5000 شجرة منفردة: كلا المحرّكين يجمعان المِشات المتكرّرة في رسومات مُنسَّخة، ومهمّتك الأولى ببساطة ألا تهزم تلك الآلية.
يجمع Unreal عبر foliage وhierarchical instanced static meshes؛ ويجمع Unity عبر GPU instancing وتفاصيل الأرض. ما يكسر الجمع بصمت:
- غطاء نباتي موضوع كـممثّلين/كائنات فريدة بدل نُسَخ؛
- متغيّرات خامة لكل نسخة: استخدم بيانات لكل نسخة (لون، مقياس) داخل خامة واحدة بدل تأليف خامة لكل مظهر؛
- وضع مبعثر تنظيميًا بحيث لا يستطيع المحرّك عزل العناقيد كوحدات.
إشارة المُنمِّط لا لبس فيها: draw call تتوسّع مع عدد النباتات. إن أظهر منظر غابة آلاف الـdraw call، فأصلِح هذا قبل لمس أي شيء آخر: لا شيء أدنى في هذه القائمة سينقذك، لأنك مقيّد بالـCPU قبل أن يبدأ الـGPU حتى. الغطاء النباتي المُنسَّخ الصحّي يُبقي الـdraw call في المئات المنخفضة لمنظر غابة كامل، مهما بلغ عدد آلاف النباتات فيه.
مسافات الـcull مالٌ مجاني
العشب لا يحتاج أن يُرسَم على بُعد 800 متر: اضبط مسافات cull لكل نوع (غطاء أرضي 30–60 م، شجيرات 100–200 م، الأشجار وحدها تستحق مسافات طويلة) مع نطاقات fade لإخفاء الظهور المفاجئ.
هذا أعلى إعداد قيمةً لكل دقيقة في كامل الـpipeline، ويُترَك روتينيًا على "لانهائي" لأنه الافتراضي هناك ولا أحد يلاحظ. المنطق إدراكي: الغطاء الأرضي يقابل أقل من بكسل واحد قبل 100 م بكثير، فلا يسهم حرفيًا بأي شيء في الصورة النهائية بينما ما زال يكلّف رؤوسًا وoverdraw وعمل ظلال كل إطار. التغطية البعيدة ملك أنظمة أرخص: لون خامة الأرض، أو impostorات معتمة، أو ببساطة LOD البعيد لطبقة الأرض مطليًّا بالأخضر الصحيح.
نطاقات الـfade (مبعثرة أو ألفا) تخفي الظهور المفاجئ فلا يرى اللاعبون مسافة الـcull نفسها أبدًا. اضبط الـfade طويلًا بما يكفي تمامًا ليكون غير مرئي ولا أطول: fade مفرط الطول يعني أنك تدفع لتمثيلين للنبتة نفسها أثناء التلاشي المتقاطع.
الظلال: النصف الصامت من الفاتورة
أوقِف إلقاء الظلال الديناميكية للغطاء الأرضي الصغير، وأبقِها للأشجار، وقيّدها بالمسافة للشجيرات: ظلال العشب تضاعف كلفتك مقابل كسب بصري يقارب الصفر.
كل شفرة عشب في مرور الظل تُرسَم مرة أخرى، من وجهة نظر الضوء. في المشاهد الكثيفة يكلّف مرور الظل غالبًا بقدر المرور الأساسي: ما يعني أن ظلال العشب قد تكون أكبر بند مفرد في كامل ميزانية الغطاء النباتي بينما يتعذّر تمييزها بصريًا عن تعتيم محيطي بسيط عند قاعدة العنقود. الإصلاح شبه مجاني: إلقاء ظلال مُطفأ للغطاء الأرضي، مُشغّل للأشجار (ظلالها تؤدّي عملًا تكوينيًا حقيقيًا)، مقيّد بالمسافة للوسط. ثم افحص مرور الظل في مُنمِّطك قبل وبعد: عادةً أكبر انتصار مفرد بعد الـinstancing، ويستغرق دقائق.
الـLOD: ميزِن الصورة الظلية، لا المضلّعات
سلسلة LOD جيدة للغطاء النباتي تحفظ الخطوط الخارجية وتذبح الداخل: تحقّق من مسافات الانتقال بالعين، وحسّن بأشدّ قدر آخر mesh LOD قبل الـimpostor، لأنه ذاك الذي على الشاشة في كل لقطة واسعة.
نباتات الطبقة الأرضية كهذه هي حيث تُثمر إعدادات مسافة الـcull والظل أكثر ما يكون: آلاف النُّسخ، كلٌّ يسهم بلا شيء تقريبًا بعد بضع عشرات من الأمتار، وكلٌّ يتضاعف في الكلفة إن ألقى ظلًّا ديناميكيًا.
سلسلة عملية لشجرة بطولية: مِش كامل → تقليص داخلي ~50 % (الصورة الظلية نفسها) → ~15 % ببطاقات مدمجة → impostor/billboard معتم. ملاحظتان توفّران ألمًا حقيقيًا:
- حتى في محرّكات الهندسة المُهيَّأة افتراضيًا، تبقى الـimpostorات البعيدة مجدية، لأن الـoverdraw والظلال تظل كلفة حقيقية بصرف النظر عن كيفية دفع المثلثات. الهندسة المُهيَّأة تحلّ عدد المثلثات، لا كلفة الشفافية.
- الشفافية عدوّ عند المسافة. البطاقات الكثيفة alpha-tested تكدّس الـoverdraw تحديدًا حيث الـGPU أضعف: الـLOD الوسطى. فضّل أوراق المِش عن قرب وimpostorات معتمة عن بُعد؛ الوسط المثقل بالألفا هو حيث يختبئ زمن الإطار. إن كان LOD ما مكلفًا بغموض، فهو تقريبًا دائمًا الشفاف.
الـoverdraw: الكلفة التي لا تراها
الـoverdraw هو أن يُظلّل الـGPU البكسل نفسه مرات عدّة عبر أسطح شفافة متراكمة: لعنة الغطاء النباتي الخاصة، غير مرئية في الصورة النهائية، وغالبًا سبب بطء مشهد "خفيف".
لدى معظم المحرّكات وضع تصوير للـoverdraw؛ شغّله وانظر إلى حقل عشب. إن توهّج أبيض، فأنت تُظلّل كل بكسل خمس أو عشر مرات فيما تتكدّس بطاقات ألفا متداخلة. التخفيفات: شفرات أقل وأكبر بدل كثير من رفيعة؛ هندسة معتمة حيث تسمح الصورة الظلية؛ وعزل عدواني للبطاقات الأقل إسهامًا. الـoverdraw هو المتّهم الكلاسيكي لـ"مشهدي بطيء لكن لا شيء يبدو مكلفًا"، لأن المثلثات رخيصة والبكسلات تُدفَع مرات عدّة.
الكثافة قرار تصميم، لا موضع منزلق
كثيفة حيث يمشي اللاعب وينظر، متناثرة حيث لا: شريط 20 م من التفاصيل الغنية بمحاذاة المسار يُقرأ "وارف في كل مكان" بجزء يسير من الكلفة المنتظمة.
أقنعة الانحدار والارتفاع تؤدّي جزءًا من هذا آليًا (الوجوه الحادة والهضاب البعيدة لا تحتاج غطاءً أرضيًا البتة)، والتكتّل يؤدّي الباقي: العناقيد ذات الفجوات تُرسَم أرخص من الملء المنتظم وتبدو أطبع، فيشير انتصار الأداء وانتصار الجمال إلى الاتجاه نفسه. هنا تكسب أدوات الوضع قوتها: رسم الكثافة بأقنعة وقواعد لكل نوع، ثم الخبز مباشرةً إلى نُسَخ أصلية للمحرّك، هو الفرق بين عصرٍ وأسبوع. إنه جوهر ما يفعله scatter من Numivo، ولأنه يخبز إلى foliage عادي ومِشات مُنسَّخة، تنطبق كل تقنية في هذه المقالة على النتيجة دون تغيير. لا يوجد runtime إضافة بينك وبين التحسينات القياسية؛ المشهد المخبوز مجرّد محتوى محرّك.
حلقة التنميط
الكاميرا نفسها، المنظر نفسه، متغيّر واحد في المرة: قِس زمن إطار الـGPU، والـdraw call، ومرور الظل، والـoverdraw بعد كل تغيير.
اختر "كاميرا ميزانية" ثابتة في أكثف مناظرك والتقط الإحصاءات قبل وبعد كل خطوة أعلاه. الانضباط مهم لأن تحسينات الغطاء النباتي تتفاعل: تغيير مسافة cull يبدّل كم نسخة يراها مرور الظل؛ وتغيير LOD يبدّل الـoverdraw؛ وتغيير الكثافة يبدّلها كلها دفعة واحدة. الطيرانات العشوائية تنتج أرقامًا عشوائية وجدالات لا تُدحَض عمّا إن ساعد تغيير. الكاميرات الثابتة تنتج قرارات تستطيع الدفاع عنها. احفظ الأرقام في ورقة مشتركة، وخط الاتجاه يخبرك بالقصة التي لا يقدر قياس واحد عليها.
أرقام ميدانية تستحق السرقة
- cull الغطاء الأرضي: 30–60 م · الشجيرات: 100–200 م · الأشجار: خط النظر
- draw call لمنظر غابة مُنسَّخ صحّي: مئات منخفضة
- حصة مرور الظل في المشاهد الكثيفة: غالبًا ~نصف كلفة الغطاء النباتي: إطفاء ظلال العشب أرخص انتصار كبير موجود
- عرض شريط dressing المسار الذي يُقرأ "وارف في كل مكان": ~20 م
- عدد الـLOD لشجرة بطولية: 3 mesh LOD + impostor معتم
- هدف الـoverdraw للعشب: أقل من ~3× في عرض الـoverdraw، لا الـ8–10× الأبيض المتوهّج لبطاقات ألفا متراكمة
أسئلة شائعة موجزة
هل يجعل Nanite / الهندسة المُهيَّأة هذا عتيقًا؟ يغيّر أي البنود تهيمن، لا الانضباط. overdraw بطاقات الألفا، وكلفة الظلال، والحمل لكل نسخة تبقى كلها، والـimpostorات عند المسافة ما زالت تدفع. قِس على عتادك المستهدف بدل افتراض أن التقنية الجديدة حلّت عنق زجاجتك المحدّد، فربما نقلته لا أزالته.
لماذا مشهدي بطيء حتى عند كثافة منخفضة؟ المشتبهون المعتادون، بالترتيب: عشب يلقي ظلالًا ديناميكية، خامة فريدة لكل متغيّر تهزم الجمع، مسافات cull لانهائية، أو سلسلة LOD alpha-tested تكدّس overdraw. لكلٍّ توقيع مُنمِّط متمايز: افحص قبل التغيير، وإلا أصلحت الخطأ.
ما مقدار "الكثافة الزائدة" للعبة؟ قابلية القراءة أثناء القتال تسقف الكثافة قبل الأداء: إن اختفت الصور الظلية في الفوضى، لام اللاعبون اللعبة لا الـdressing. كثيفة في المنظر، معتدلة في الحلبة هو النمط الذي ينجو من المُنمِّط واختبار اللعب معًا.
أأخبِز أم أُبقيه إجرائيًا؟ اخبِز للشحن: النُّسَخ المخبوزة تُنمَّط بصدق وتُشحَن بلا اعتماد runtime. أبقِ الإعداد الإجرائي (أقنعة، قواعد، بذور) في التحكّم بالإصدارات كي تعيد الخبز بعد تغيير أرض دون إعادة العمل باليد.
الكثيف المظهر والسريع ليس تناقضًا: إنه في الغالب انضباط فعل خمسة أشياء بالترتيب الصحيح وإثبات كلٍّ بالكاميرا نفسها.