تحسين الرسومات. مثيرة للاهتمام مقعر هال

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

السبب بسيط - المعالجات الجديدة بها العديد من النوى ، لكنها في الواقع أقل كفاءة في التطبيقات ذات الخيوط المفردة. في ذلك الوقت ، كان لدي عرض في تيار واحد. ولكن في الواقع ، لم تكن الأسباب كثيرة في هذا. وفي عملية العثور على المشكلة ، قررت حساب عدد المضلعات الموجودة في المشهد:



على خريطة اللعبة المتوسطة ، مع أقصى مسافة ومع مجموعة كبيرة من أشجار النخيل - 15 824 756 مثلثات! ما يقرب من 16 مليون دولار! عدد ضخم.

بعد أن لعبت قليلاً مع منشئ الخرائط ، تمكنت من العثور على مكان به 16.75 مليون:



رغم أن هناك مكانًا مشابهًا لأشجار عيد الميلاد لم يعط سوى 8.5 مليون مثلث:



يتكون المشهد المتوسط ​​من حوالي 4 ملايين:



بشكل عام ، كنت سعيدًا لأن معالجتي كانت تتعامل مع هذا العدد الهائل من المثلثات ، لكن عددها كان مفرطًا. كان الحل على السطح:

  1. قم بتحسين عدد المضلعات في النماذج.
  2. تحسين شبكة المضلع من المناظر الطبيعية.
  3. تنفيذ التقديم متعدد الخيوط.

بالنسبة لأولئك الذين قد لا يهتمون بالفقرة الأولى من برنامج التحسين الخاص بنا ، على سبيل المثال ، المتخصصين عديمي الخبرة ، أوصي بالانتقال بأمان إلى الجزء الثاني.

1. تعظيم الاستفادة من عدد المضلعات في النماذج


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



الحزمة الواحدة عبارة عن شبكة واحدة ، حيث إن تقليل عدد الشبكات يقلل بشكل كبير من عدد مكالمات وحدة المعالجة المركزية (GPU)>.



في البداية ، كانت أشجارنا تتألف من مخاريط مقطوعة ، تنتقل إلى مخاريط كاملة ، وتمكنا من إزالة بضع مثلثات إضافية:



كان الكرز على الكعكة هو قرار إزالة جذوع الأشجار ، لأنه مع زاوية الكاميرا الخاصة بنا لم تكن مرئية.

نتيجة لذلك ، تمكنا من تقليل عدد المضلعات ، على حزمة واحدة من أشجار عيد الميلاد ، بمعدل 40 ٪. الاختلافات تكاد تكون غير مرئية:



مع أشجار النخيل كان الأمر أكثر صعوبة ، ولكن هناك حاجة إلى إصلاح حزم من 5000 - 6000 مضلع. كيفية تحقيق كتلة وكثافة الغابة؟ تم تحقيق كثافة عالية من الغابة بسبب العدد الكبير من أشجار النخيل:



قررنا تبسيط أشجار النخيل وإدخال طبقة ثانية من الغطاء النباتي ، مما سمح لنا بالحفاظ على الكثافة المرئية وتحقيق 600 - 700 مضلع لكل حزمة.



إن تقليل عدد المضلعات بمقدار 10 مرات هو نتيجة ممتازة.



2. الاستفادة المثلى من المشهد شبكة المضلع



في البداية ، كانت شبكة المناظر الطبيعية:



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



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



في المثال المحدد ، اتضح: مجموعة واحدة من المثلثات غير القابلة للتغيير ، لأنها كانت جميعها عبارة عن ارتفاعات مختلفة (مثلثات حمراء) وقائمة تتكون من صفيفين من المثلثات بنفس الطول (تمتلئ الصفائف بالألوان).

كانت المهمة الآن هي العثور على مجموعة من المثلثات كفاف محدب مقعر (Concave Hull) ، والعديد من المثلثات يمكن أن يكون لها ثقوب. في وقت سابق ، واجهت محدب هال في عملي ، لم تكن هناك مشاكل معهم ، لقد استخدمت بالفعل خوارزمية غراهام. ولكن كانت هناك مشاكل في إنشاء Concave Hull ... اتضح أنه من الصعب جدًا العثور على معلومات حول هذا الموضوع على الإنترنت. كان علي أن أكتب تنفيذ الخوارزميات من الصفر. لن أكذب إذا قلت أنني قد قرأت حوالي عشرة أطروحات مختلفة حول هذا الموضوع. ولكن أعطت جميع الخوارزميات المقترحة نتيجة تقريبية مع بعض الخطأ. بعد أسبوع من العذاب والألم ، توصلت إلى فكرة الخوارزمية الخاصة بي.

حاولت بناء كفاف من مجموعة رؤوس المثلثات ، أي قمت بترجمة مجموعة المثلثات إلى مجموعة من الرؤوس وقمت ببناء قذيفة عليها. ولكن لمهمتي هذا لم يكن مطلوبا. وفقا لاستنتاجاتي ، كان بناء قذيفة مباشرة من المثلثات أسهل ، وكانت دقة هيكل مقعر 100 ٪.

في البداية ، أردت وضع خليط من الشفرة المصدرية للخوارزمية هنا ، ولكن يبدو من السهل وصفها باختصار: الأساس هو القاعدة: إذا كان رأس المثلث مدرجًا في أربعة مثلثات أو أقل ، فستقع إحدى الحواف التي تشكل الرأس على الحدود. بعد ذلك ، يتم تشكيل قائمة بهذه الحواف مع مراعاة إزالة الحواف المتطابقة. نجد الحافة مع أصغر X و Y ومنه نبدأ مرور / فرز الحواف مع إضافة رؤوس فريدة إلى القائمة. هذه القائمة ستكون بمثابة صدفة للعديد من المثلثات. الشيء الوحيد في النهائي هو إزالة النقاط الخطية من القائمة.

كنتيجة لذلك ، استطعت بناء مقعرة هال من أي تعقيد تقريبا. لم تندرج هذه الخوارزمية في مجموعة ثقب ، لكنني ذهبت حول هذا ببساطة بتقسيم هذه المجموعة إلى نصفين في حفرة. ثم حصلت على الدائرة ومثلثتها:







كل شيء اتضح بخير:



لكن في النهاية ، شعرت بالضيق من النتيجة. أعطت الخوارزمية التي قمت بتطويرها زيادة ملموسة في الأداء عند تقديم مشهد ، حيث انخفض عدد المضلعات في المتوسط ​​بنسبة 60 - 70٪. ولكن في الوقت نفسه ، بدأ توليد البطاقات يحدث 10 مرات أبطأ. تحولت الخوارزمية إلى أنها تستغرق وقتًا طويلاً للغاية.

استغرق الأمر ثلاثة أيام للنظر في إصدار خفيف الوزن من الخوارزمية لتحسين شبكة المضلعات للمناظر الطبيعية ، والتي أعطت هذه النتائج:



الآن أصبحت حسابات البيانات الخاصة بالتحسين غير ملحوظة على خلفية إنشاء الخرائط ، كما انخفض عدد المضلعات في المتوسط ​​بنسبة 40-50٪.

هذه المقالة هي محاكمة والسطحية. إذا كان أي شخص مهتمًا بموضوع تطوير اللعبة ، فأنا مستعد للمتابعة والتوسع في المقالة مع شبح الخطوات والحلول والخطط المستقبلية المحددة. أيضًا ، أعتقد أنك ستهتم بموضوع إنشاء تطبيق Open GL متعدد الخيوط تم تطويره في Java ، والذي سأحاول التحدث عنه في المقالة التالية.

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


All Articles