بعد فهم أساسيات عملية عرض الشبكة ، يمكنك تطبيق العديد من التقنيات لتحسين سرعة العرض.
مقدمة
كم عدد المضلعات التي يمكنني استخدامها؟ هذا سؤال شائع جدًا يطرحه الفنانون عند إنشاء نماذج للتقديم في الوقت الفعلي. من الصعب الإجابة على هذا السؤال ، لأنه ليس مجرد مسألة أرقام.
بدأت حياتي المهنية كفنان ثلاثي الأبعاد في عهد أول بلاي ستيشن ، وأصبحت فيما بعد مبرمج رسومات. أرغب في قراءة هذا المقال قبل أن أبدأ لأول مرة في إنشاء نماذج ثلاثية الأبعاد للألعاب. الأسس الأساسية التي تعتبرها مفيدة لكثير من الفنانين. على الرغم من أن معظم المعلومات الواردة في هذه المقالة لن تؤثر بشكل كبير على إنتاجية عملك اليومي ، إلا أنها ستمنحك فهمًا أساسيًا لكيفية قيام وحدة معالجة الرسومات (GPU) بعرض الشبكات التي تنشئها.
تعتمد سرعة عرضه عادة على عدد المضلعات في الشبكة. ومع ذلك ، على الرغم من أن عدد المضلعات يرتبط غالبًا بمعدل الإطارات في الثانية (FPS) ، فقد تجد أنه حتى بعد تقليل عدد المضلعات ، لا تزال الشبكة تظهر ببطء. ولكن من خلال فهم كيفية تقديم الشبكات بشكل عام ، يمكنك تطبيق مجموعة من التقنيات لزيادة سرعة التجسيد.
كيف يتم تقديم بيانات المضلع
لفهم كيفية رسم GPU للمضلعات ، تحتاج أولاً إلى النظر في بنية البيانات المستخدمة لوصف المضلعات. يتكون المضلع من مجموعة من النقاط تسمى الرؤوس والروابط. غالبًا ما يتم تخزين القمم كصفائف للقيم ، مثل الشكل 1.
الشكل 1. مجموعة من القيم المضلعة البسيطة.في هذه الحالة ، تعطينا أربعة رؤوس بثلاثة أبعاد (x و y و z) 12 قيمة. لإنشاء مضلعات ، تصف المجموعة الثانية من القيم الرؤوس نفسها ، كما هو مبين في الشكل 2.
الشكل 2. مجموعة من الروابط إلى القمم.تشكل هذه القمم المتصلة معًا مضلعين. لاحظ أنه يمكن وصف مثلثين ، ولكل منهما ثلاث زوايا ، بأربعة رؤوس ، لأن القناتان 1 و 2 تستخدمان في كلا المثلثين. من أجل معالجة GPU لهذه البيانات ، من المفترض أن يكون كل مضلع مثلثي. تتوقع وحدات معالجة الرسومات العمل مع المثلثات لأنها مصممة خصيصًا لرسمها. إذا كنت بحاجة إلى رسم مضلعات مع عدد مختلف من الرؤوس ، فأنت بحاجة إلى تطبيق يقسمها إلى مثلثات قبل عرضها على GPU. على سبيل المثال ، إذا قمت بإنشاء مكعب مكون من ستة مضلعات ، لكل منها أربعة جوانب ، فإن هذا لن يكون أكثر فعالية من إنشاء مكعب مكون من 12 مضلّع يتكون من ثلاثة جوانب ؛ هذه هي المثلثات التي سيرسمها GPU. تذكر القاعدة: تحتاج إلى حساب ليس المضلعات ، ولكن مثلثات.
بيانات قمة الرأس المستخدمة في المثال السابق هي ثلاثية الأبعاد ، لكن هذا ليس ضروريًا. قد يكون البعدان كافيين بالنسبة لك ، ولكن غالبًا ما تحتاج إلى تخزين بيانات أخرى ، على سبيل المثال ، إحداثيات الأشعة فوق البنفسجية للأنسجة العادية والإضاءة.
رسم المضلع
عند تقديم مضلع ، تحدد وحدة معالجة الرسومات أولاً مكان رسم المضلع. للقيام بذلك ، يقوم بحساب الموضع على الشاشة حيث يجب أن تكون الرؤوس الثلاثة. هذه العملية تسمى تحويل. يتم إجراء هذه الحسابات في وحدة معالجة الرسومات بواسطة برنامج صغير يسمى تظليل قمة الرأس.
غالبًا ما يؤدي shader vertex أنواعًا أخرى من العمليات ، مثل معالجة الرسوم المتحركة. بعد حساب مواضع القمم الثلاثة للمضلع ، يحسب GPU البيكسلات الموجودة في هذا المثلث ، ثم يبدأ في ملء هذه البيكسلات ببرنامج صغير آخر يسمى "شظية شظية" (شظايا شظية). عادة ما يتم تنفيذ تظليل جزء مرة واحدة لكل بكسل. ومع ذلك ، في بعض الحالات النادرة ، يمكن تنفيذها عدة مرات لكل بكسل ، على سبيل المثال ، لتحسين مكافحة التعرجات. غالبًا ما تسمى تظليل الشظايا بتظليل البيكسل ، لأن الشظايا في معظم الحالات تتوافق مع البيكسلات (انظر الشكل 3).
الشكل 3. مضلع واحد رسمها على الشاشة.يوضح الشكل 4 تسلسل الإجراءات التي يؤديها GPU عند تقديم المضلع.
الشكل 4. ترتيب GPU مما يجعل المضلع.إذا قسمت المثلث إلى قسمين ورسمت مثلثين (انظر الشكل 5) ، فإن الإجراء سوف يتوافق مع الشكل 6.
الشكل 5. تقسيم المضلع إلى قسمين.الشكل 6. الإجراء من GPU رسم اثنين من المضلعات.في هذه الحالة ، هناك حاجة إلى ضعف عدد التحويلات والتحضيرات ، ولكن نظرًا لأن عدد وحدات البكسل لا يزال كما هو ، فلن تحتاج العملية إلى تنقيط وحدات بكسل إضافية. هذا يدل على أن مضاعفة عدد المضلعات لا يؤدي بالضرورة إلى مضاعفة وقت العرض.
باستخدام ذاكرة التخزين المؤقت قمة الرأس
إذا نظرت إلى مضلعين من المثال السابق ، يمكنك أن ترى أن لهما رأسان مشتركان. يمكن افتراض أن هذه الرؤوس يجب أن تُحسب مرتين ، لكن آلية تُسمى ذاكرة التخزين المؤقت لـ vertex تسمح لك بإعادة استخدام نتائج الحساب. يتم تخزين نتائج حسابات تظليل قمة الرأس لإعادة استخدامها في ذاكرة التخزين المؤقت - وهي مساحة صغيرة من الذاكرة تحتوي على القمم القليلة الأخيرة. يظهر الشكل 7 الإجراء الخاص برسم مضلعين باستخدام ذاكرة التخزين المؤقت لـ vertex.
الشكل 7. رسم مضلعين باستخدام ذاكرة التخزين المؤقت قمة الرأس.بفضل ذاكرة التخزين المؤقت لـ vertex ، يمكنك رسم مضلعين بأسرع ما يمكن إذا كان لهما رؤوس مشتركة.
نحن نتعامل مع معلمات القمم
لكي تكون قمة الرأس قابلة لإعادة الاستخدام ، يجب أن تتغير مع كل استخدام. بالطبع ، يجب أن يظل الموقف كما هو ، ولكن يجب ألا تتغير المعلمات الأخرى أيضًا. المعلمات التي تم تمريرها إلى الأعلى تعتمد على المحرك المستخدم. فيما يلي معلمتان شائعتان:
عند تطبيق الأشعة فوق البنفسجية على كائن ثلاثي الأبعاد ، فإن أي تماس تم إنشاؤه يعني أنه لا يمكن مشاركة الرؤوس على طول التماس. لذلك ، في الحالة العامة ، يجب تجنب اللحامات (انظر الشكل 8).
الشكل 8. الأشعة فوق البنفسجية الملمس خياطة.لإضاءة السطح بشكل صحيح ، عادةً ما يخزن كل قمة رأسًا عاديًا - ناقل موجه من السطح. نظرًا لحقيقة أن جميع المضلعات ذات الرأس المشتركة يتم تحديدها بواسطة حرف عادي ، فإن شكلها يبدو سلسًا. وهذا ما يسمى التظليل السلس. إذا كان لكل مثلث قيمته الطبيعية ، عندها تصبح الحواف بين المضلعات واضحة ، ويبدو السطح مستويًا. لذلك ، وهذا ما يسمى شقة مظللة. يوضح الشكل 9 شبكتين متطابقتين ، واحدة ذات تظليل سلس والآخر مع تظليل مسطح.
الشكل 9. مقارنة السلس مع التظليل المسطح.يتكون هذا الشكل الهندسي الناعم المظلل من 18 مثلثًا ويحتوي على 16 رأسًا مشتركًا. يتطلب التظليل المسطح المكون من 18 مثلثًا 54 رأسًا (18 × 3) ، لأنه لا تتم مشاركة أي من القمم. حتى إذا كان لشبكتين نفس عدد المضلعات ، فستظل سرعة العرض مختلفة.
أهمية الشكل
تعمل وحدات معالجة الرسومات بسرعة أساسًا لأنها يمكن أن تؤدي العديد من العمليات بشكل متوازٍ. غالبًا ما تركز مواد تسويق GPU على عدد خطوط الأنابيب التي تحدد عدد وحدات معالجة الرسومات التي يمكنها القيام بها في نفس الوقت. عندما يقوم GPU بسحب المضلع ، فإنه يعطي مهمة العديد من خطوط الأنابيب لملء مربعات البكسل. هذا عادة ما يكون ثمانية في ثمانية بكسل مربع. يستمر GPU في القيام بذلك حتى يتم ملء جميع وحدات البكسل. من الواضح أن المثلثات ليست مربعات ، لذلك ستكون بعض وحدات البكسل في المربع داخل المثلث ، والبعض الآخر خارجها. تعمل المعدات مع جميع وحدات البكسل في مربع ، حتى تلك الموجودة خارج المثلث. بعد حساب كل القمم في المربع ، يتجاهل الجهاز البيكسلات خارج المثلث.
يوضح الشكل 10 مثلثًا ، يتطلب ثلاثة مربعات (مربعات) للرسم. يتم استخدام معظم وحدات البكسل المحسوبة (سماوي) ، وتلك التي تظهر باللون الأحمر تتجاوز حدود المثلث وسيتم تجاهلها.
الشكل 10. ثلاثة البلاط لرسم مثلث.يتطلب المضلع في الشكل 11 بنفس عدد البكسلات بالضبط ، ولكن ممتدًا ، مزيدًا من البلاط ليملأها ؛ سيتم تجاهل معظم النتائج في كل مربع (منطقة حمراء).
الشكل 11. تعبئة البلاط في صورة ممتدة.عدد البكسل الذي تم تقديمه هو مجرد واحد من العوامل. شكل المضلع مهم أيضًا. لزيادة الكفاءة ، حاول تجنب المضلعات الضيقة الطويلة وإعطاء الأفضلية للمثلثات ذات الأطوال المتساوية تقريبًا من الجوانب ، التي تكون زاويتها قريبة من 60 درجة. يتم تثليث السطحين المسطحين في الشكل 12 بطريقتين مختلفتين ، لكنهما يبدوان متماثلين عند تقديمهما.
الشكل 12. تثليث الأسطح بطريقتين مختلفتين.لديهم نفس العدد من المضلعات والبكسلات بالضبط ، ولكن نظرًا لأن سطح اليسار أطول من المضلعات الأضيق من اليمين ، فسيكون عرضه أبطأ.
إعادة رسم
لرسم نجمة سداسية ، يمكنك إنشاء شبكة من 10 مضلعات أو رسم نفس الشكل من مضلعين فقط ، كما هو موضح في الشكل 13.
الشكل 13. طريقتان مختلفتان لتقديم نجمة سداسية الرؤوس.يمكنك أن تقرر أنه من الأسرع رسم مضلعين من 10. ومع ذلك ، في هذه الحالة ، يكون هذا غير صحيح على الأرجح ، لأنه سيتم رسم البيكسلات الموجودة في مركز النجم مرتين. هذه الظاهرة تسمى overdraw. في الجوهر ، هذا يعني أن البكسل يتم إعادة رسمه أكثر من مرة. تحدث عملية إعادة الرسم بشكل طبيعي خلال عملية التقديم بأكملها. على سبيل المثال ، إذا تم إخفاء حرف جزئيًا بواسطة عمود ، فسيتم رسمه بالكامل ، على الرغم من حقيقة أن العمود يتداخل مع جزء من الحرف. تستخدم بعض المحركات خوارزميات معقدة لتجنب تقديم كائنات غير مرئية في الصورة النهائية ، ولكن هذه مهمة صعبة. غالبًا ما تكون وحدة المعالجة المركزية أكثر صعوبة في تحديد ما لا يلزم تقديمه من وحدة معالجة الرسومات (GPU) لرسمه.
كفنان ، يجب أن تتفق مع حقيقة أنه لا يمكنك التخلص من إعادة الطلاء ، ولكن من الممارسات الجيدة إزالة الأسطح التي لا يمكن رؤيتها. إذا كنت تتعاون مع فريق تطوير ، اطلب إضافة وضع تصحيح الأخطاء إلى محرك اللعبة ، حيث يصبح كل شيء شفافًا. سيؤدي ذلك إلى تسهيل العثور على المضلعات المخفية التي يمكن حذفها.
تنفيذ درج على الأرض
يوضح الشكل 14 مشهدًا بسيطًا: صندوق يقف على الأرض. تتكون الأرضية من مثلثين فقط ، ويتكون المربع من 10 مثلثات. يظهر الرسم في هذا المشهد باللون الأحمر.
الشكل 14. درج يقف على الأرض.في هذه الحالة ، ستقوم وحدة معالجة الرسومات (GPU) بسحب جزء من الأرضية إلى الأرض باستخدام درج ، على الرغم من أنه لن يكون مرئيًا. إذا أنشأنا بدلاً من ذلك ثقبًا في الأرضية أسفل الصندوق ، لكنا قد تلقينا المزيد من المضلعات ، ولكننا سنعيد رسمنا أقل بكثير ، كما يتضح من الشكل 15.
الشكل 15. ثقب تحت الدرج لتجنب إعادة الرسم.في مثل هذه الحالات ، كل هذا يتوقف على اختيارك. في بعض الأحيان ، يكون من المفيد تقليل عدد المضلعات ، والحصول على إعادة رسم في المقابل. في حالات أخرى ، يجدر إضافة مضلعات لتجنب إعادة الرسم. مثال آخر: الشكلان الموضحان أدناه هما نفس سطح السطح مع نقاط تخرج عنه. في الشبكة الأولى (الشكل 16) ، توجد النصائح على السطح.
الشكل 16. وتقع نصائح على السطح.في الشبكة الثانية في الشكل 17 ، يتم قطع الثقوب في السطح تحت النصائح لتقليل كمية إعادة الرسم.
الشكل 17. يتم قطع الثقوب تحت النصائح.في هذه الحالة ، تمت إضافة الكثير من المضلعات لقطع الثقوب ، بعضها ذو شكل ضيق. بالإضافة إلى ذلك ، فإن سطح إعادة الرسم ، الذي تخلصنا منه ، ليس كبيرًا جدًا ، لذلك في هذه الحالة ، هذه التقنية غير فعالة.
تخيل أنك تقوم بنمذجة منزل يقف على الأرض. لإنشائها ، يمكنك إما ترك الأرض دون تغيير ، أو قطع حفرة في الأرض أسفل المنزل. تكون عملية إعادة الرسم أكثر عندما لا يتم قطع الفتحة أسفل المنزل. ومع ذلك ، يعتمد الاختيار على الشكل الهندسي ووجهة النظر التي يرى اللاعب من خلالها المنزل. إذا قمت برسم الأرض أسفل قاعدة المنزل ، فسيؤدي ذلك إلى إنشاء كمية كبيرة من إعادة الرسم إذا ذهبت داخل المنزل ونظرت لأسفل. ومع ذلك ، لن يكون الفرق كبيرًا بشكل خاص إذا نظرت إلى المنزل من طائرة. في هذه الحالة ، من الأفضل أن يكون لديك وضع تصحيح الأخطاء في محرك اللعبة يجعل الأسطح شفافة حتى تتمكن من رؤية ما يتم رسمه تحت الأسطح مرئيًا للاعب.
عندما Z- مخازن لديها ص الصراع
عندما يرسم GPU اثنين من المضلعات المتداخلة ، كيف يمكن تحديد أي منهما أعلى الآخر؟ قضى الباحثون رسومات الكمبيوتر الأولى الكثير من الوقت في البحث في هذه المشكلة. كتب Ed Catmell (الذي أصبح فيما بعد رئيسًا لشركة Pixar و Walt Disney Animation Studios) مقالة حددت عشرة أساليب مختلفة لهذه المهمة. في جزء واحد من المقال ، يلاحظ أن حل هذه المشكلة سيكون تافهاً إذا كانت لدى أجهزة الكمبيوتر ذاكرة كافية لتخزين قيمة عمق واحدة لكل بكسل. في سبعينيات وثمانينيات القرن العشرين ، كانت كمية كبيرة جدًا من الذاكرة. ومع ذلك ، تعمل معظم وحدات معالجة الرسومات اليوم على النحو التالي: يسمى هذا النظام بـ Z-buffer.
يعمل المخزن المؤقت Z (المعروف أيضًا باسم المخزن المؤقت للعمق) على النحو التالي: مع كل بكسل تقترن قيمة العمق. عندما تقوم المعدات برسم كائن ، فإنها تحسب إلى أي مدى يتم رسم البيكسل من الكاميرا. ثم يتحقق قيمة عمق بكسل الموجودة. إذا كان بعيدًا عن الكاميرا عن البكسل الجديد ، فسيتم رسم البيكسل الجديد. إذا كان البيكسل الموجود أقرب إلى الكاميرا من البيكسل الجديد ، فلا يتم رسم البيكسل الجديد. هذا النهج يحل العديد من المشاكل ويعمل حتى لو تقاطع المضلعات.
الشكل 18. المضلعات المتقاطعة معالجتها بواسطة عمق العازلة.ومع ذلك ، لا يحتوي المخزن المؤقت Z دقة لا نهائية. إذا كان سطحان على مسافة واحدة تقريبًا من الكاميرا ، فإن هذا يربك وحدة معالجة الرسومات ويمكنه اختيار أحد السطوح بشكل عشوائي ، كما هو موضح في الشكل 19.
الشكل 19. السطوح بنفس العمق تعاني من مشاكل في العرض.وهذا ما يسمى Z القتال ويبدو عربات التي تجرها الدواب جدا. غالبًا ما تتفاقم صراعات Z ، كلما كانت السطح بعيدًا عن الكاميرا. يمكن لمطوري المحركات دمج التصحيحات في هذه الملفات لتخفيف هذه المشكلة ، ولكن إذا قام أحد الفنانين بإنشاء مضلعات قريبة بما فيه الكفاية وتتداخل مع بعضها البعض ، فلا يزال من الممكن أن تنشأ مشكلة. مثال آخر هو جدار مع ملصق معلق عليه. يقع الملصق على نفس العمق تقريبًا من الكاميرا مثل الجدار الذي يقف خلفه ، وبالتالي فإن خطر حدوث تعارضات Z مرتفع جدًا. الحل هو قطع ثقب في الجدار تحت الملصق. هذا سوف يقلل أيضا من كمية إعادة رسم.
الشكل 20. مثال على تضارب Z للمضلعات المتداخلة.في الحالات القصوى ، يمكن أن يحدث صراع Z حتى عندما تلمس الكائنات بعضها البعض. يوضح الشكل 20 الدرج الموجود على الأرض ، ولأننا لم نقطع فتحة في الأرض أسفل الدرج ، يمكن خلط العازلة z بجانب الحافة حيث تلتقي الأرضية بالدرج.
باستخدام مكالمات السحب
أصبحت وحدات معالجة الرسومات سريعة للغاية - بسرعة بحيث لا تتمكن وحدات المعالجة المركزية من مواكبة هذه الوحدات. نظرًا لأن وحدات معالجة الرسومات (GPU) مصممة بشكل أساسي لأداء مهمة واحدة ، فهي أسهل بكثير في العمل بسرعة. ترتبط الرسومات بطبيعتها بحساب وحدات بكسل متعددة ، بحيث يمكنك إنشاء أجهزة تحسب وحدات بكسل متعددة بشكل متوازٍ. ومع ذلك ، فإن وحدة معالجة الرسومات (GPU) لا تقدم إلا ما تطلبه لرسم وحدة المعالجة المركزية. إذا لم تستطع وحدة المعالجة المركزية "تغذية" وحدة معالجة الرسومات بسرعة بالبيانات ، فستكون بطاقة الفيديو في وضع الخمول. في كل مرة تطلب وحدة المعالجة المركزية GPU لرسم شيء ما ، يطلق عليه استدعاء السحب. تتكون أبسط مكالمات السحب من تقديم شبكة واحدة ، بما في ذلك تظليل واحد ومجموعة واحدة من القوام.
تخيل معالجًا بطيئًا يمكنه نقل 100 مكالمة سحب لكل إطار ، ووحدة معالجة الرسومات السريعة التي يمكنها سحب مليون مضلع لكل إطار. في هذه الحالة ، يمكن لنداء السحب المثالي أن يسحب 10،000 مضلّع. إذا كانت شبكاتك تتكون من 100 مضلّع فقط ، فسيتمكن GPU من رسم 10000 مضلع فقط لكل إطار. هذا هو ، 99 ٪ من الوقت سوف يكون GPU خاملا. في هذه الحالة ، يمكننا بسهولة زيادة عدد المضلعات في الشبكات دون فقد أي شيء.
ما يتكون من مكالمة السحب ، وتكلفة ذلك ، يعتمد بشكل كبير على محركات وبنيات محددة. يمكن أن تجمع بعض المحركات بين العديد من الشبكات في مكالمة سحب واحدة (إجراء الدُفعات ، الدُفعات) ، ولكن سيتعين على جميع الشبكات أن يكون لها نفس التظليل ، أو قد يكون لها قيود أخرى. تم تصميم واجهات برمجة التطبيقات الجديدة مثل Vulkan و DirectX 12 خصيصًا لحل هذه المشكلة عن طريق تحسين كيفية تواصل البرنامج مع برنامج تشغيل الرسومات ، وبالتالي زيادة عدد مكالمات السحب التي يمكن نقلها في إطار واحد.
إذا كان فريقك يكتب محركه الخاص ، فاستفسر من مطوري المحرك عن القيود التي تجذب المكالمات. إذا كنت تستخدم محركًا جاهزًا مثل Unreal أو Unity ، فقم بتشغيل معايير الأداء لتحديد حدود إمكانيات المحرك.
قد تجد أنه يمكنك زيادة عدد المضلعات دون التسبب في انخفاض السرعة.الخاتمة
آمل أن تكون هذه المقالة مقدمة جيدة لمساعدتك في فهم الجوانب المختلفة من تقديم الأداء. في وحدات معالجة الرسومات لمختلف الشركات المصنعة ، يتم تنفيذ كل شيء قليلاً بطريقته الخاصة. هناك العديد من التحفظات والشروط الخاصة المتعلقة بمحركات معينة ومنصات الأجهزة. حافظ دائمًا على حوار مفتوح مع المبرمجين لتقديم توصياتهم في مشروعك.عن المؤلف
إسكيل ستينبرج هو مطور مستقل للألعاب والأدوات ، وهو يعمل كمستشار ومشروعات مستقلة. تم التقاط جميع لقطات الشاشة في المشروعات النشطة باستخدام الأدوات التي طورتها Esquil. يمكنك معرفة المزيد حول عمله على موقع Quel Solaar وعلى حساب تويترquelsolaar.