Isometry ، مؤشرات z في ألعاب الجوال وتحسينها


مرحبا يا هبر! لقد خرجنا مؤخرًا بلعبتنا ، التي أعددناها لفترة طويلة وخلالها تراكم عدد كبير من الموضوعات المثيرة للاهتمام والتي تستحق المشاركة مع المجتمع. سيكون الموضوع محل اهتمام ليس فقط لنظام التشغيل iOS وغيره من مطوري الهواتف المحمولة ، ولكن أيضًا لجميع أولئك المهتمين بكيفية عمل جميع أنواع الأشياء الرسومية تحت غطاء المحرك ، بالإضافة إلى جميع محبي استراتيجيات ثنائية الأبعاد ، والتي كنت أنا عليها في العقد الثالث.

سنتحدث اليوم عن الفروق الدقيقة في موضوع مهم مثل الفهارس z على سطح متساوي القياس (نعم ، ليس كل شيء بسيطًا كما يبدو لبعض المحترفين). في عالم 3D ، لدينا ، بشكل غريب ، ثلاثة إحداثيات - x ، y ، z - تحدد بشكل كامل موضع الجسم في الفضاء. توجد مهمة تحديد قرب الأشياء من الكاميرا أيضًا ، ولكنها تقع بالكامل على أكتاف OpenGL. لا يعمل المطور إلا بمعلمات عالية المستوى مثل عمق المخزن المؤقت z ، مما يؤثر على الأداء ، ولكن بخلاف ذلك يمكنك الوثوق بـ OpenGL كمربع أسود - فهو يحتوي على معلومات كافية.

لوحظ وضع مختلف تمامًا في عالمنا "الزائف ثلاثي الأبعاد" - كل كائن له فقط (س ، ص) - إحداثيات وحجم العفريت. المهمة الأولى التي يواجهها المبرمج عند كتابة محرك هي مهمة تحديد الكائنات التي يجب أن تتداخل مع بعضها البعض أمام "الكاميرا" الافتراضية الخاصة بنا.

الخلاصة


إحداثيات SpriteKit (حيث (0؛ 0) هي مركز "العالم" و Y ترتفع) في هذه الحالة نحن لسنا مهتمين على الإطلاق ، لأن إنها لا تعني شيئًا في "عالمنا" المتساوي القياس لدينا ، لذلك دعونا نقوم بالحجز - لدينا مجال على شكل الماس مثل Age of Empires



يوجد بلاطة ذات إحداثيات (0 ؛ 0) في الزاوية اليسرى من المعين ، وتزيد الخراج X "لأسفل" و "لليمين" ، أي تقترب من المراقب ، تزيد الإحداثي Y من "أعلى" و "إلى اليمين" ، أي ينخفض ​​كلما اقتربت من المراقب.

أيضا ، يجب أن تكون القضبان "تحت" القطار ، يجب أن يكون الدخان من المدخنة "فوق" القطار. لكننا لن نزعج أنفسنا الآن بـ "طبقات الوجود" - من الواضح أنه لا يوجد شيء يمنعنا من عمل العديد من "الشرائح" المتوازنة كما تريد ، والعمل وفقًا لنفس القواعد. نفترض أنه يوجد في قطعة واحدة دائمًا كائن واحد - للتوضيح ، ليس هناك حاجة إلى المزيد.



خذ بعين الاعتبار القطرين أعلاه. من الواضح ، من وجهة نظر المراقب ، أن السيارات يجب أن تكون "أسفل" القطار ، أي يجب أن يكون مؤشر z الخاص بهم أقل. في الوقت نفسه ، يجب أن يتداخل القطار "العلوي" مع الجار ، ويكون "أبعد". هل يمكننا ، بوجود الإحداثيات فقط (س ؛ ص) ، إنشاء خريطة للمؤشرات z لكل بلاط؟

من الواضح ، نعم ، باستخدام الصيغة التالية (pseudocode a la swift):

zIndex = pos.x * field.size.width - pos.y 

وبالتالي ، نضمن أنه مع نمو الإحداثيات ، تتحرك الأجسام بعيدًا (-pos.y) ، وكذلك مع الزيادة في الخراجية ، فإن نهج الأجسام (pos.x) ، والأهم من ذلك ، أن أي جسم له خراج ، على سبيل المثال 44 ، سيكون "أقرب" عمدا "من أي شيء يحتوي على خراج 43. لإضافة" طبقات "هنا (تذكر ، القضبان تحت القطار ، الدخان فوق المدخنة) ، يكفي إضافة بعض" ارتفاع "ثابت للطبقة:

 zIndex = layerZIndex + pos.x * field.size.width - pos.y 

هذا كل شيء ، يمكنك إنهاء المقالة ، والثناء على أساسيات القياس المجسّم التي تعلمتها في الصف العاشر وبدء منطق اللعبة. لا؟ إذا فقط! أود أن أكتب عن الأشياء الواضحة! (حسنًا ، كما هو واضح ، يتم سحق يومين وهذا)

نحن فقط ننزل إلى الجزء الممتع ، ننتقل.

صراع الأداء


قام الجميع ، على الأقل مرة واحدة ، بإجراء مشروع اختبار لـ SpriteKit (أو جوز الهند ، أو أي محرك آخر) ، وشاهدوا أرقامًا سحرية - fps والعقد.



من الواضح أن fps هو عدد الإطارات في الثانية ، والعقد هي عدد العقد ، وبشكل رئيسي العفاريت. ولكن في الممارسة العملية ، يتم تعيين معظم الإطارات في الثانية ليس بعدد العقد ، ولكن بواسطة معلمة أخرى ، والتي لا يتم عرضها افتراضيًا ، ولكن يمكن عرضها أيضًا بسطر واحد - عدد عمليات السحب التي أعيد رسمها.



في نفس المشهد ، كما ترى الآن ، يبلغ عدد العقد حوالي 6000 ، ويبلغ عدد العروض حوالي 120. هذا عند الحد الأدنى من التكبير (تكون الكاميرا قريبة من السطح قدر الإمكان) ، 1: 1.

الآن دعنا ننقل الكاميرا إلى أقصى مسافة (في لعبتنا 2.5: 1)



لقد قمنا بتغيير المقياس بمقدار 2.5 مرة فقط (في المثال ، بعيدًا عن كل الكائنات يتم رسمها) ، وزاد عدد السحوبات بمقدار 5-6 مرات مع عدم احتساب العقد!

بطبيعة الحال ، يؤثر عدد العروض على عدد الإطارات في الثانية بشكل لا يقاس أكثر من العدد المجرد للعقد. SpriteKit فقط لا يرسم العقد التي لا تقع في إطار العرض (في الكاميرا). الاستثناء الوحيد الذي وجدته حتى الآن هو بواعث الجسيمات ، والتي يتم رسمها دائمًا ، بغض النظر عما إذا كانت مرئية أم لا.

الآن دعونا نتحدث عن معنى هذا "الرسم". تحتوي بطاقة الفيديو على جميع "طبقات" العقد ، مسترشدة بفهارسها z. ويمر عبر الصورة الكاملة مرارا وتكرارا ، من الأدنى إلى الأعلى. عدد دورات التقديم هذه يوجه.

الآن أنت تفهم أنه إذا قمت برسم كل كائن صغير (ولدينا خريطة كبيرة ، حوالي 6000 × 3000) مع فهرس z الخاص بها ، فسوف يؤدي ذلك إلى إتلاف أداء أي هاتف.

من الأفضل رؤية المشاكل في 5 و 5 s القديمة ، لكن وجود iPhone 10 لا يضمن أي شيء - مع النهج الخاطئ ، يمكنك التخلص من أي جهاز قوي. في لعبتنا ، كان أحد أحجار الزاوية هو الوضوح الشديد. في أقرب تقريب ، تتوافق نقوش فردية مع وحدات بكسل ريتين. يجب أن أقول أنه في معظم ألعاب الهاتف المحمول ، تكون الدقة أقل من حيث الحجم ، لذا فإن المتطلبات ليست هائلة ، لكننا فعلناها نوعيًا ، كما نحن أنفسنا ...

لذا عليك الذهاب إلى الحيل.

  • يمكن عمومًا دمج جميع الكائنات التي لا يتفاعل معها اللاعب ، والتي تكون في نفس المستوى في إحداثيات X ، في نقش متحرك واحد. بالنسبة لبطاقة الفيديو ، من الأسهل بكثير رسم نقش واحد كبير من 10 صغير. لذلك ، فإن ممرات الغابات بين الطرق هي رواسب متكاملة تتكون من عدة أشجار. والأشجار التي لا تتداخل مع المسارات والأشجار الأخرى تُخيط بشكل عام في الخريطة. في ألفا ، بالمناسبة ، كان هناك عدد قليل جدًا من الأخطاء عندما نما البلوط الذي يبلغ قرونًا تحت قضبان القطار أو تحت إشارة مرور القطار ، لذا اختبر لعبتك بعناية حتى لا تروق المستخدمين.
  • يتم رسم الكائنات التي لها فهرس z بالترتيب الذي تظهر به على بطاقة الفيديو. على سبيل المثال عند إضافة الأشياء "البعيدة" قبل الأشياء "القريبة" ، ستسقط بشكل صحيح ، ولكنها لن تزيد من عدد عمليات عرض بطاقة الرسومات.

كل هذا يسمح لك بتقليل عدد السحوبات في بعض الأحيان ، إصلاح fps حتى على iPhone القديم. اضطررت إلى تقييد بعض التأثيرات بشدة عليهم ، لكن Apple لم تصدر تحديثات لها لمدة عام الآن - ستشكو خطيئة!

الارتفاع


حسنًا ، كل شيء ، المحرك جاهز ، هل يمكنك بدء شيء مثير للاهتمام بالفعل؟ يمكن لشخص ما ، ولكن من السابق لأوانه بالنسبة لنا. بعد كل شيء ، يجب أن يغادر القطار النفق بشكل جميل ، وهنا كل شيء ليس بسيطًا كما قد يبدو.



يجب أن يكون القطار "أعلى" من الجدار "البعيد" للنفق ، و "أقل" من سقف النفق والجبال التي تتبعه. إنه جميل ، بعد كل شيء ، عندما تكون الخريطة متعددة المستويات ، مع تغييرات الارتفاع - مرة أخرى ، نحن لا نفعل هراء بلا روح ، ولكن ما نحبه نحن أنفسنا!

ولكن بالعودة إلى التفاصيل ، فقد تم "قطع" الخريطة على النحو التالي.



الجدار الداخلي للنفق وكل شيء آخر إلى اليسار أقل و



الجزء العلوي من النفق مع الجبال التي يتدفق إليها. هنا ، لن يساعد أي إنشاء إجرائي للمؤشرات z ، إلا رمزًا صارمًا من بيلاروسيا.

لاحظ الحاجز اليقظ في لقطة الشاشة من اللعبة أنه بالقرب من الأنفاق ، تم "قص" الأشجار بدقة ، مما يعرض رمال الشاطئ البكر. يأتي هذا العيب الظاهر من الاستحالة الأساسية لتحقيق مثل هذه الغرسات في 2D. يجب أن يكون القطار ، الذي يغادر النفق ، متعمداً "فوق" الأشجار التي يتداخل معها ، ويغطيها بنفسه. لكن هذه الأشجار نفسها يجب أن تتداخل مع سقف النفق ، الذي يجب أن يستقل القطار تحته! ويجب أن يكون السقف أعلى من القطار ، وهكذا في دائرة ، لدينا تناقض منطقي ...

لسبب مماثل ، بسبب عدم كمال محرك الرسومات ، في الألعاب القديمة مثل Duke Nukem و Doom2 لا توجد اختلافات كبيرة في ارتفاعات وأرضيات المباني.

هذا هو السبب في أن الأشجار لا تنمو بالقرب من الأنفاق.

آمل أنها كانت مثيرة للاهتمام ، اللعبة تعيش هنا (مجانًا للعب) ، وستكون المقالة التالية في السلسلة حول مياه واقعية ثنائية الأبعاد جميلة ، لا تفوتها!

PS بالمناسبة ، يمكن مشاهدة فيديو لجذب الانتباه على موقع يوتيوب بجودة عادية.

PPS اللعبة متاحة حتى الآن فقط في رابطة الدول المستقلة وكندا وأيرلندا ، إذا أراد شخص ما النظر من بلدان أخرى ، فأرسل بريدًا إلكترونيًا شخصيًا باستخدام appleId - سأضيفها إلى TestFlight

Source: https://habr.com/ru/post/ar415051/


All Articles