Рубрика развивается при поддержке

Как отлавливают баги в Sea of Thieves — часть четвёртая Материал редакции

Работа автоматической системы поиска ошибок.

В закладки
Аудио

Автор блога AI and Games Томми Томпсон опубликовал последнюю часть анализа ИИ в Sea of Thieves. Если в прошлых текстах Томпсон уделял внимание отдельным врагам, боссам и поведению живности, то в этот раз он рассказал про автоматизированную систему поиска багов. Мы выбрали из его материала главное.

Весь процесс разработки делится на несколько крупных этапов, во время которых сам проект вырастает из изначальной задумки в полноценную игру. На первых этапах программисты должны довести игру до простого варианта, в котором заметен лишь основной геймплей и главная задумка. На альфе все механики уже сделаны, но арт и ассеты ещё не закончены. В бете механики, звук и визуал уже полностью готовы и интегрированы в игру.

Хоть на этапе беты игра уже во многом похожа на полноценную, в ней остаётся ещё множество багов низкого приоритета, которые нужно исправить. После этого тайтл «уходит на золото», и наступает релиз.

Игры достаточно сложны по своей структуре, поэтому в них неизбежно появляются ошибки. Многие из них исправляются ещё во время разработки, потому что мешают дальнейшему продвижению, а более мелкие баги выявляются на поздних этапах. Тем не менее важно учитывать, что исправление ошибок само по себе может привести к появлению дополнительных багов.

Разработчики из Rare поняли, что для Sea of Thieves им не подойдёт вариант, в котором они вылавливают баги на каждом этапе разработки, полируют проект перед релизом, а затем исправляют патчами. Команда решила, что такой подход не применим к игре-сервису, потому что «финишная черта», к которой нужно выполнить все работы так никогда и не материализуется, а всегда отодвигается вперёд.

Кроме того, поскольку в игру постоянно добавляются новые функции, есть реальный шанс, что вся эта тяжелая работа по устранению ошибок будет отменена, поскольку в тайтле появятся новые элементы.

В связи с этим, в начале работы над Sea of Thieves инженеры Rare использовали процесс, который называется «test-driven development», в соответствии с которым в проекте применяются тесты, которые проверяют работоспособность определённых функций. Когда новый код добавляется в игру, он сперва должен пройти все тесты. Такой подход позволяет уменьшить количество проблем, которые могут возникнуть во время отдельных этапов.

Роб Маселла, старший инженер по геймплею, а также Энди Бестейбл, ведущий инженер по геймплею в Rare, рассказали, что их желание внедрить автоматическую систему тестирования родилось ещё во время разработки Kinect Sports, потому что тогда им требовалось значительное количество тестов с людьми, чтобы убедиться, что функции работают должным образом. Но это стало ещё более актуально, когда они начали трудиться над игрой-сервисом Sea of Thieves.

Набор тестов встроен в кодовую базу таким образом, что каждый раз, когда член команды пытается сохранить свою работу в исходном коде, происходит проверка того, насколько это нарушит функционирование всей игры.

Подавляющее большинство таких тестов представляют собой модульные тесты, написанные на C++ — они проверяют отдельные функции. Правильно ли скелет использует экипированный предмет? Стреляют ли они в игрока в нужный момент?

Но есть и интеграционные тесты, в которых проверяется совместная работа разных игровых функций. Это также позволяет протестировать более сложную логику игрового процесса и часто достигается с помощью тестовых карт и blueprints в Unreal Engine. Такая же система распространяется и на деревья поведения, тесты для которых созданы, чтобы гарантировать, что ИИ переключается между поведениями или выполняет последовательности действий правильно.

Лучше всего показать работу этих принципов на конкретной ситуации. Например, ИИ-скелет наблюдает за игроком, а затем теряет его из виду. В его поведение заложено, что он пойдёт в то место, где в последний момент был замечен игрок. Это довольно простая функция поведения ИИ, но есть множество причин, из-за которых всё может пойти не так — в игру могут добавить новую функцию, которая нарушит код восприятия; или внести изменения в управление памятью скелетов, из-за чего местоположение игрока будет неправильно сохраняться и так далее.

Так или иначе ошибку должен выявить сотрудник QA. Или же игроки уже в релизной версии найдут баг и сообщат об этом. В любом случае разработчикам требуется всё больше и больше времени, чтобы выяснить, что это за ошибка, и найти способ её исправить.

Тем не менее исправление бага может привести к новым проблемам, которые обнаружатся в скором времени. Это означает, что цикл должен повториться, а это потребует дополнительных сил и времени. Поэтому автоматическое тестирование важно, так как оно позволяет разработчикам сосредоточить свои усилия на новых игровых функциях, в то время как команда QA и сообщество смогут посвятить своё время оценке общего опыта.

Сами тесты настраиваются с помощью существующей системы автоматизации, встроенной в Unreal Engine, но есть также внешний инструмент, созданный инженерами Rare для запуска тестов вне редактора UE4.

Но что более интересно, тесты можно запускать как на встроенных исполняемых файлах, так и удалённо в системах, связанных с репозиторием исходного кода проекта. С помощью TeamCity создаются новые варианты игры, а затем запускаются автоматические тесты для текущей сборки.

Когда в проект необходимо добавить новое изменение, разработчик должен протестировать его, прежде чем оно будет зафиксировано. Перед отправкой кода в хранилище исходного кода, он проходит тестирование. Затем будет ещё один этап проверки: это важно, потому что изменение может не вызвать каких-либо проблем в тестах, которые считаются релевантными для этой функции, но это может повлечь за собой более серьёзную проблему в будущем.

Сервер запускает все небольшие тесты примерно каждые двадцать минут, а это означает, что возникающие ошибки часто могут быть быстро обнаружены. Сама команда может видеть всю информацию о текущем состоянии проекта, что позволяет им быстро выявлять собственные ошибки.

Также система одновременно запускает более масштабные и сложные тесты, которые, например, касаются мультиплеера и производительности. Более крупные и сложные формы интеграционных тестов требуют, чтобы система имитировала многопользовательскую активность. Хотя это распространяется на все виды игровых систем, это очень важно для ИИ, учитывая, что все их действия выполняются на сервере.

Таким образом, эти тесты используют симуляцию многопользовательского поведения на виртуальном сервере, чтобы убедиться, что всё работает должным образом. Помимо этого, запускаются тесты производительности, задержки сети и платформы. Это полезно в ситуациях когда новое изменение проходит все тесты, отлично работает на ПК, но приводит к неожиданному снижению производительности на Xbox One.

Если изменение не проходит ни один из этих тестов, оно удаляется из сборки и отправляется обратно автору. Как объяснил Роб, все программисты совершают ошибки независимо от опыта, поэтому они избегают каких-либо обвинений в студии.

Эти тесты гарантируют, что подавляющее большинство ошибок, способных нарушить работоспособность игры, не встретятся обычным пользователям. Такой подход позволил последовательно проверять Sea of Thieves во время разработки. Полная версия нынешней игры тестировалась более 100 раз — и это если не учитывать бесчисленные проверки разрозненных уровней и демо-версий.

{ "author_name": "Владимир Семыкин", "author_type": "editor", "tags": ["qa","\u0438\u0438"], "comments": 6, "likes": 28, "favorites": 45, "is_advertisement": false, "subsite_label": "gamedev", "id": 61977, "is_wide": true, "is_ugc": false, "date": "Wed, 07 Aug 2019 14:42:34 +0300", "is_special": false }
0
{ "id": 61977, "author_id": 94357, "diff_limit": 1000, "urls": {"diff":"\/comments\/61977\/get","add":"\/comments\/61977\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/61977"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64954, "last_count_and_date": null }
6 комментариев
Популярные
По порядку
Написать комментарий...
1

В связи с этим, в начале работы над Sea of Thieves инженеры Rare использовали процесс, который называется «test-driven development», в соответствии с которым в проекте применяются тесты, которые проверяют работоспособность определённых функций. Когда новый код добавляется в игру, он сперва должен пройти все тесты.

Вообще говоря, TDD предполагает, что тесты пишутся вообще ДО кода и потом уже код пишется так, чтобы все тесты прошли. Так-то тесты сами по себе всегда применяются (если работают не индусы)

Ответить
3

TDD перепутали с автотестами и регрессионным тестированием.

Ответить
0

Тем не менее, в игре хренова туча багов и по сей день ) Мелких багов, почти не раздражающих, но они есть :(

Ответить
0

Например? Я просто не так часто играю и не так активно (плаваю себе да и всё) и мне ничего особого не попадалось. Только визуальные баги/недоработки: вроде тонущего корабля, который всегда делает сальто, проходя под землёй своими мачтами.

Ответить
1

Первые полгода после релиза вылетали серваки, бесконечный черный экран загрузки. До лета 2018 корабли могли летать, а до осени могли пружинить от островов. Сейчас основная проблема в pvp - это регистрация выстрелов/попаданий, которую уже решат в течение месяца (спустя год после релиза )))

Ответить
0

Не замечал всего этого, но спасибо!

Ответить

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovz", "p2": "glug" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Баннер в ленте на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]