اختبار محرك لعبة Amazon Lumberyard. المناهج والأدوات

أمازون ألعاب. يبدو غير عادي؟ كيف تختبر المنتج لكل من المطورين واللاعبين؟ تحت الاختبار - اختبار محرك لعبة Amazon Lumberyard ، يقترب كل من الاختبار اليدوي والأتمتة ، وكذلك الأدوات المستخدمة في المشروع.



Lumberyard هو محرك ألعاب متعدد المنصات حيث يمكنك إنشاء ألعاب مجانًا لمعظم الأنظمة الأساسية الحديثة: PC ، و Mac ، و iOS / Android ، وجميع وحدات التحكم ، بما في ذلك نظارات الواقع الافتراضي. كما أنه متكامل تمامًا مع Amazon Web Services وخدمة البث في لعبة Twitch.

تحت المقطع - فيديو ونص تقرير أرتيم نيسيولوفسكي من مؤتمر Heisenbug .




عن المتحدث: تخرج من معهد موسكو للفيزياء الهندسية ، كلية علم التحكم الآلي ، أكثر من 8 سنوات في التطوير والاختبار. عمل في مشاريع سطح المكتب ، مثل تجربة GeForce ، و MMORPG Lineage II عبر الإنترنت ، وفي الهاتف المحمول - لعبة Cut the Rope ، وكذلك في مشروع Yandex.Images على الويب. وهو حاليًا مهندس أتمتة في Amazon في مشروع Amazon Lumberyard.

هيكل الوظائف


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


مزيد من السرد نيابة عن المتحدث.



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

قررت أمازون بناء نظام بيئي على ثلاث ركائز: فتح استوديو الألعاب الخاص بها لإنشاء ألعاب يقوم الناس ببثها ومشاهدتها على Twitch. ستعرض هذه الألعاب أيضًا أفكار اللعب المثيرة للاهتمام التي يمكن تنفيذها باستخدام AWS Cloud.

كيف جميعا لم تبدأ؟


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

بحيث لا يخترع كل استوديو دراجة - محرك عرض خاص به ، نظام رسوم متحركة ، فيزياء ، وما إلى ذلك ، ترخص Amazon CryEngine الإصدار 3 وتطلق تطوير العديد من الألعاب في وقت واحد. تم إصدار Grand Tour بالفعل على Xbox و PlayStation. هناك اثنان آخران قيد التطوير: MMORPG "New World" وألعاب إطلاق النار على الإنترنت "Crucible". بعد بدء تطوير هذه الألعاب ، تبدأ أمازون في توفير المحرك المجاني الذي تم تطوير هذه الألعاب عليه. نظرًا لأنها متكاملة للغاية مع خدمات السحابة من Amazon ، يمكنك جذب المزيد من الأشخاص لاستخدام AWS.



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

بدلاً من التحدث لفترة طويلة ، يكون من الأسهل أحيانًا عرض مقطع فيديو واحد:

رابط إلى الفيديو 8: 33-9: 53

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

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

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

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

كيف تختبر المحرك؟


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

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

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

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

تؤثر جميع هذه الميزات الثلاثة بشكل كبير على عدد البرامج النصية المخصصة ، والتي يجب اختبار كل منها.



انظر إلى لقطة الشاشة هذه وتخيل عدد حالات الاختبار التي يمكنك كتابتها فقط لهذا الجزء من الوظيفة؟ في المجموع ، لدينا أكثر من 11 ألف حالة اختبار في المشروع وقاعدة البيانات هذه تنمو بنحو 3-4 آلاف حالة اختبار كل عام.

رابط الفيديو 13: 20-13: 54

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

رابط الفيديو 14: 08-14: 41

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

رابط الفيديو 15: 02-15: 49

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

رابط الفيديو 16: 03-17: 14

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

كيفية تحديد التغطية؟


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

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



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

سنقوم بتحليل هذا النموذج بمثال صغير. فيما يلي عرض توضيحي لجزء صغير من الوظائف:

رابط إلى الفيديو 19: 59-21: 02

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



دعونا نلقي نظرة على نموذج ACC نفسه. لقد أدركنا بسرعة أن هذه النماذج مريحة للغاية لإنشاء باستخدام Mindmaps ، ثم ترجمتها إما إلى أقراص أو مباشرة إلى الهيكل في TestRail أو في أي مستودع آخر لحالات الاختبار. المكون الرئيسي نفسه مرئي في الرسم التخطيطي في المركز - Viewport - علاوة على ذلك من أعلى الفرع الأحمر توجد ميزة Viewport التي تسمح لك بالتنقل حول المستوى: يمكنك تدوير الكاميرا ، ويمكنك الطيران باستخدام الأزرار "W" و "A" و "S" و "D".

فرصته الثانية (الفرع البرتقالي) هي إنشاء كيانات اللعبة إما من خلال Viewport أو عن طريق السحب والإفلات من مستكشف الألعاب.

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

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



رابط الفيديو 23: 01-24: 10

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

النتائج والاستنتاجات


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



بدأنا في أتمتة المحرك من خلال أتمتة واجهة المستخدم. تمت كتابة واجهة المحرر في مكتبة QT. هذه مكتبة لكتابة واجهة المستخدم عبر الأنظمة الأساسية لتطبيقات سطح المكتب ، والتي يمكن أن تعمل على كل من Mac و Windows. استخدمنا أداة تسمى Squish من Froglogic ، والتي تعمل على نظام مشابه مع WebDriver ، معدلة لبيئة سطح المكتب. في هذه الأداة ، يتم استخدام نهج مشابه لكائن الصفحة (من عالم WebDriver) ، ويطلق عليه بشكل مختلف - هندسة العناصر المركبة. يتم عمل المحددات على المكونات الرئيسية (مثل "نافذة" أو "زر") ويتم تسجيل الوظائف التي يمكن إجراؤها باستخدام هذه العناصر. على سبيل المثال ، "النقر بزر الماوس الأيمن" أو "النقر بزر الماوس الأيسر" أو "حفظ" أو "إغلاق" أو "خروج". ثم يتم دمج هذه العناصر في بنية واحدة ،يمكنك الوصول إليها داخل النص الخاص بك ، واستخدامها ، والتقاط لقطة شاشة ومقارنتها.

المشاكل والحلول


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

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

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



جاء الحل في شكل مكتبة شبوكين. توفر هذه المكتبة روابط من كود C ++ في Python ، مما يجعل من الممكن استدعاء الوظائف التي يوفرها المحرر أو المحرك مباشرة دون عرض محرر واجهة المستخدم. تناظري من عالم الويب - الأتمتة بدون رأس (شيء مشابه لـ PhantomJS) - يمكنك أتمتة تطبيق ويب دون تشغيل متصفح. في هذه الحالة ، نظام مشابه ، فقط لتطبيق مكتبي مكتوب بلغة C ++.

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



الجزء الثاني من حل المشكلة. أدركنا بسرعة أنه لأتمتة أجزاء مختلفة من محركنا - على سبيل المثال ، الرسومات وأجزاء الشبكة - كنا بحاجة إلى أطر مختلفة تمامًا. من المستحيل إنشاء إطار واحد وحشي سيساعد على أتمتة كل شيء في وقت واحد. لذلك ، بدأنا في تطوير إطار عمل يسمى أدوات اختبار Lumberyard (للاختصار - LyTestTools). يعتمد على Pytest (تتم كتابة الكثير من الأشياء في المحرك في Python). قررنا استخدام ما يسمى بهندسة التوصيل والتشغيل - تكتب المجموعة المركزية من مهندسي الأتمتة الجزء الرئيسي من إطار العمل ، والذي يمكنه تنزيل وتكوين المحرك ونشره على منصات مختلفة وتشغيل الاختبارات وجمع السجلات وتحميل التقارير إلى قاعدة البيانات الخاصة بنا أو S3 ورسم الرسومات في Quicksight. يتم التوصيل والتشغيل من خلال Test Helper's ،والتي ستكتبها فرق في الميدان تعمل على تطوير الميزات.

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

التفاعل مع Lumberyard


ما هي طرق التفاعل / التشغيل الآلي لتطبيق سطح المكتب؟ النوع الأول من التفاعل بين الإطار والمحرك - مباشرة من Python ، يتم بدء العملية باستخدام وظيفة Subprocess ، إذا كان التطبيق يتضمن التشغيل من خلال سطر الأوامر. يمكنك قراءة الإدخال / الإخراج من إخراج الإدخال / الإخراج القياسي وبالتالي إجراء تأكيدات. النوع التالي - هذا التفاعل من خلال تحليل السجلات - يمكنك قراءة وتحليل السجلات التي تركها التطبيق. والثالث هو من خلال الشبكة. في قاذفات اللعبة ، هناك وحدة تسمى وحدة التحكم عن بعد. عندما يتم فتح منفذ معين على الجهاز ، يمكن أن يرسل إطار عملنا حزم / أوامر محددة. على سبيل المثال ، خذ لقطة شاشة أو افتح مستوى معينًا. طريقة أخرى هي التفاعل من خلال مقارنة المعلومات المرئية ، أي لقطات الشاشة.كما تم ذكره سابقًا طريقة استدعاء وظائف التطبيق مباشرة من خلال واجهة برمجة تطبيقات المنتج (في حالتنا ، هذه مكالمة من خلال Python-bindings إلى وظيفة محرر / محرك C ++).

دعنا ننتقل إلى أمثلة لاستخدام إطار عملنا لأتمتة المحرك.

ألق نظرة على لقطة الشاشة هذه.



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

واحد منهم يسمى أداة الغطاء النباتي. عرض توضيحي صغير:

رابط إلى الفيديو 32: 18-34: 06

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

دعنا الآن نرى كيف قمنا بأتمتة هذه الميزة مع إطار عملنا باستخدام اثنين من الاختبارات كمثال.

Link to video 34: 20-34: 58

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



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



يظهر رمز المعلمة أعلاه أنه يمكننا إعادة استخدام نفس الرمز على منصات مختلفة. علاوة على ذلك ، يمكننا إعادة استخدام نفس الرمز على مستويات أو مشاريع مختلفة. على سبيل المثال ، يتم تمييز الأنظمة الأساسية باللون الأحمر: في إحدى الحالات يكون Windows ، وفي حالة أخرى يكون Mac ؛ تم تمييز المشروع باللون الأصفر ؛ يتم تمييز مستوى الاسم باللون الأصفر الفاتح.

رابط للفيديو 36: 07-36: 47

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



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



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



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



في الاستمرار ، يتم إنشاء فرشاة جديدة ، يتم تعيين كثافة مختلفة لها. لم يعد القناع مستخدمًا ، وفي الدورة ، بالفعل في جزء آخر من المستوى ، يتم رسم عنصر جديد.

دعونا نرى كيف يعمل هذا البرنامج النصي.

Link to video 38: 42-39: 35

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

يأخذ الاختبار لقطات الشاشة هذه للمقارنة مع المعايير. هنا يمكنك أن ترى أن الصورة ذهبت بوضوح على طول الحدود.

الفنون التصويرية


نستخدم أيضًا إطار عملنا لاختبار الرسومات.

رابط للفيديو 40: 04-40: 56

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



هذه هي شخصيتنا ، Rin. من خلال ذلك ، نقوم باختبار خطوط أنابيب الفنانين غالبًا. ينشئ الفنانون شيئًا في محررهم (على سبيل المثال ، حرف) ، ثم يرسمون عليه القوام. يعالج Asset Processor البيانات الأصلية لنشرها على منصات مختلفة ، وسيتعامل محرك الرسومات مع الشاشة.



بالتأكيد واجهت خطأ في كثير من الأحيان عندما "لم يتم تحميل القوام." في الواقع ، هناك الكثير من المشاكل عندما حدث شيء لعرض القوام.



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



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



من خلال مقارنة لقطات الشاشة ، يمكنك اختبار الرسومات وعناصر العرض والقوام والمواد والمظللات.

سأعطي مثالًا على خطأ واحد من الإصدار القديم لمحركنا عندما لم يكن لدينا هذا الإطار.

رابط إلى الفيديو 43: 10-43: 44

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

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

رابط للفيديو 44: 16-44: 52

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

لا يمكن الإمساك بكل شيء


Link to video 45: 03-45: 17

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



بمقارنة لقطات الشاشة ، يمكنك اختبار واجهة المحرر نفسه.

مكونات اللعبة




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

يمكنك التقاط لقطة شاشة في البداية وفي النهاية. إذا تطابق كل شيء ، فإن النص الذي يغير موقع العنصر يعمل بشكل صحيح.

اعوجاج


أدركنا بسرعة أن لقطات الشاشة للوظيفة نفسها مختلفة تمامًا على الأنظمة الأساسية المختلفة ، وفي بعض الحالات قد تكون هناك اختلافات على نفس النظام الأساسي اعتمادًا على نوع بطاقة الفيديو. كيف تتعامل مع هذا حتى لا تخزن 100500 لقطة شاشة؟ هناك أداة ، Windows Advanced Rasterization Platform هو برنامج عرض يسمح لك بالقيام بكل الرسومات دون اللجوء إلى برنامج التشغيل وبطاقة الفيديو. باستخدام هذه الأداة ، يمكنك قيادة معظم اختبارات الرسومات الوظيفية دون الاعتماد على برامج التشغيل والأجهزة.

أداء


أخيرًا وليس آخرًا ، يجب أن يكون محرك اللعبة منتجًا! يمكن اختبار GPUs باستخدام أدوات تحليل رسومية مختلفة ، مثل PIX. يمكن اختبار ذاكرة الوصول العشوائي في Visual Studio نفسه. علاوة على ذلك ، المزيد حول كيفية اختبار أداء المعالج باستخدام أداة RADTelemetry.

تعرف ما هو Input Lag؟

رابط إلى الفيديو 47: 29-48: 21

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

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

يوجد برنامج يسمى RADTelemetry.

رابط الفيديو 49: 44-50: 47

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

وأين AWS هنا؟


في الختام ، بضع كلمات حول AWS. من ناحية ، نستخدمها لدفع اختباراتنا. نجري اختبارات على EC2 وعلى الأجهزة من Device Farm. تتم إضافة النتائج إلى قاعدة البيانات في S3 ، ويتم عرض الرسوم البيانية في Quicksight. يمكن عرض إحصائيات الاختبار في CloudWatch. نظرًا لأن المحرك متكامل تمامًا مع خدمات AWS ، فإننا نختبر هذه عمليات التكامل أيضًا - يدويًا وتلقائيًا. على سبيل المثال ، CloudCanvas هي خدمة تتيح لك إنشاء وظائف لألعاب الشبكة بدون برمجة ، أي أنه على الخادم يمكنك ببساطة تكوين شرائح مثل لوحات المتصدرين وجداول النقاط والإنجازات. بالنسبة لأشياء مثل تحقيق الدخل من الألعاب ، لا يمكنك البحث عن مبرمج الخادم الخاص بك ، ولكن البدء فورًا في استخدام CloudCanvas. Amazon GameLift هو في الأساس نظام قابل للتطوير لخوادم الألعاب.التكامل مع Twitch - عندما يشاهد المستخدمون بث لاعبين يتنافسان فيما بينهما. تم إنشاء استطلاع Twitch "من هو اللاعب الذي تدعمه؟" - يبدأ الناس التصويت في الدردشة ، وتقرأ اللعبة الإجابات ، ويمكن أن يفقد أحد اللاعبين (كما هو الحال في ألعاب الجوع) مكافأة إضافية أو يمنعها.

ملخص


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

في الختام ، روابط لجميع الأدوات التي تم عرضها في التقرير:



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

إذا كنت مهتمًا بموضوع اختبار الألعاب ، فنحن نوصيك بالاطلاع على تقارير أخرى:


All Articles