Редактирование: S.T.A.L.K.E.R.: Чистое небо — интервью о проблемах выживания искусственного интеллекта в Чернобыльской Зоне

Перейти к: навигация, поиск

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 14: Строка 14:
 
'''Дмитрий Ясенев''': Здравствуйте. Меня зовут Дмитрий Ясенев, я ведущий программист на проекте S.T.A.L.K.E.R.: Чистое Небо в GSC Game World.
 
'''Дмитрий Ясенев''': Здравствуйте. Меня зовут Дмитрий Ясенев, я ведущий программист на проекте S.T.A.L.K.E.R.: Чистое Небо в GSC Game World.
  
На курсе искусственного интеллекта в университете я впервые познакомился с ИИ для игр на доске. Потом этот интерес перерос в создание программы, которая умеет играть в реверси, она не стала лучшей, но выиграла один чемпионат по синхронным случайным реверси. По окончании университета в 2002-м году, я начал работать программистом искусственного интеллекта в компании GSC Game World на проекте S.T.A.L.K.E.R.: Shadow of Chernobyl.
+
На курсе искусственного интеллекта в университете я впервые познакомился с интеллектом для игр на доске. Потом этот интерес перерос в создание программы, которая умеет играть в реверси, она не стала лучшей, но выиграла один чемпионат по синхронным случайным реверси. По окончании университета в 2002-м году, я начал работать программистом искусственного интеллекта в компании GSC Game World на проекте S.T.A.L.K.E.R.: Shadow of Chernobyl.
  
  
Строка 24: Строка 24:
 
'''Вопрос''': У вас присутствует тонкая грань между игрой и симуляцией. Насколько глубоко реализованы идеи симуляции жизни в S.T.A.L.K.E.R.?
 
'''Вопрос''': У вас присутствует тонкая грань между игрой и симуляцией. Насколько глубоко реализованы идеи симуляции жизни в S.T.A.L.K.E.R.?
  
'''Дмитрий Ясенев''': Наша реализация системы симуляции жизни не претендует на звание полной и единственно правильной. Концепция живого мира, в котором каждый персонаж имеет свою цель, очень богата и разнопланова. Поэтому реализовать её в полной мере задача непростая и объёмная. Особенно если мы говорим о шутерах, в которых детализация действий находится на высоком уровне, и красивость отыгрыша анимации может иметь большее значение, чем высокоуровневые действия персонажа. Об этом много говорят. Например, обсуждался вопрос о том, почему приёмы ИИ в RTS не переходят в FPS. Я бы ещё поинтересовался у разработчиков ИИ в шутерах, сколько времени они тратят на низкий уровень и сколько на высокий, мой прогноз: хорошо, если будет 10 к 1.
+
'''Дмитрий Ясенев''': Наша реализация системы симуляции жизни не претендует на звание полной и единственно правильной. Концепция живого мира, в котором каждый персонаж имеет свою цель, очень богата и разнопланова. Поэтому реализовать её в полной мере задача непростая и объёмная. Особенно если мы говорим о шутерах, в которых детализация действий находится на высоком уровне, и красивость отыгрыша анимации может иметь большее значение, чем высокоуровневые действия персонажа. Об этом много говорят. Например, обсуждался '''Вопрос''' о том, почему приёмы ИИ в RTS не переходят в FPS. Я бы ещё поинтересовался у разработчиков ИИ в шутерах, сколько времени они тратят на низкий уровень и сколько на высокий, мой прогноз: хорошо, если будет 10 к 1.
  
  
Строка 31: Строка 31:
 
'''Дмитрий Ясенев''': Наша реализации симуляции достаточно проста. Мы ввели два термина, характеризующие 2 модели поведения персонажа, отличающихся степенью детализации: оффлайн и онлайн. Оффлайновое поведение персонажа является очень простым с точки зрения детализации: персонаж не отыгрывает анимации, звуки, не управляет активно инвентарём, не строит детализированные сглаженные пути (хотя строит пути по глобальному навигационному графу, но об этом позже) и т.д. Онлайновое поведение напротив имеет полную степень детализации. Т.о. можно считать, что оффлайновое поведение является лодом онлайнового.
 
'''Дмитрий Ясенев''': Наша реализации симуляции достаточно проста. Мы ввели два термина, характеризующие 2 модели поведения персонажа, отличающихся степенью детализации: оффлайн и онлайн. Оффлайновое поведение персонажа является очень простым с точки зрения детализации: персонаж не отыгрывает анимации, звуки, не управляет активно инвентарём, не строит детализированные сглаженные пути (хотя строит пути по глобальному навигационному графу, но об этом позже) и т.д. Онлайновое поведение напротив имеет полную степень детализации. Т.о. можно считать, что оффлайновое поведение является лодом онлайнового.
  
В нашей системе, пока игрок играет на своём уровне, другие персонажи живут на других уровнях, т.е. находятся в оффлайне, т.е. используют оффлайновое поведение. Более того, в виду большой населённости, не все персонажи в пределах одного уровня имеют онлайновое поведение, а лишь те, кто находятся в заданном радиусе от игрока (это может зависеть от уровней, обычно в районе 150 метров) или же по желанию геймдизайнеров.
+
В нашей системе пока игрок играет на своём уровне, другие персонажи живут на других уровнях, т.е. находятся в оффлайне, т.е. используют оффлайновое поведение. Более того, в виду большой населённости, не все персонажи в пределах одного уровня имеют онлайновое поведение, а лишь те, кто находится в заданном радиусе от игрока (это может зависеть от уровней, обычно в районе 150 метров) или же по желанию гейм дизайнеров.
  
 
Для реализации этого симулятор следит за передвижением игрока и объектов в оффлайне и переводит их в онлайн/оффлайн. При вычислении перехода объектов используется стандартный трюк с инерцией: радиус перехода в оффлайн больше радиуса перехода в онлайн.
 
Для реализации этого симулятор следит за передвижением игрока и объектов в оффлайне и переводит их в онлайн/оффлайн. При вычислении перехода объектов используется стандартный трюк с инерцией: радиус перехода в оффлайн больше радиуса перехода в онлайн.
  
Далее стоит сказать о навигации объектов в онлайне и оффлайне. У нас в игре есть уровни, для каждого из которых создаётся свой навигационный граф, который используют персонажи для передвижения в онлайне. Мы называем его [[Сетка навигации ИИ | детальным графом]]. Для каждого детального графа также создаётся его менее детализированный аналог, вершины которого можно связать с вершинами такого же графа другого уровня/ей. Т.о. после объединения всех таких графов воедино мы получаем граф, который объединяет все уровни. Он и используется персонажами для передвижения в оффлайне. Также им пользуются персонажи в онлайне, когда они выполняют свои стратегические цели. Например, если персонаж в онлайне решил идти на другой уровень, то он строит путь по глобальному графу, затем строит путь по детальному графу своего уровня со своей позиции до [[Точки графа | точки глобального графа]]. Если эта точка уже на другом уровне, то он телепортируется туда и автоматически переходит в оффлайн. Для того, чтобы это не происходило на глазах у игрока, мы располагали точки перехода для NPC где-то «за углом», дальше точек перехода для игрока.
+
Далее стоит сказать о навигации объектов в онлайне и оффлайне. У нас в игре есть уровни, для каждого из которых создаётся свой навигационный граф, который используют персонажи для передвижения в онлайне. Мы называем его детальным графом. Для каждого детального графа также создаётся его менее детализированный аналог, вершины которого можно связать с вершинами такого же графа другого уровня/ей. Т.о. после объединения всех таких графов воедино мы получаем граф, который объединяет все уровни. Он и используется персонажами для передвижения в оффлайне. Также им пользуются персонажи в онлайне, когда они выполняют свои стратегические цели. Например, если персонаж в онлайне решил идти на другой уровень, то он строит путь по глобальному графу, затем строит путь по детальному графу своего уровня со своей позиции до точки глобального графа. Если эта точка уже на другом уровне, то он телепортируется туда и автоматически переходит в оффлайн. Для того, чтобы это не происходило на глазах у игрока, мы точки перехода для игровых персонажей ставили дальше точки перехода игрока, где-то «за углом» ?
  
  
Строка 42: Строка 42:
 
'''Дмитрий Ясенев''': У персонажа в игре всегда есть цель. На ранних версиях симулятора это была цель разгадать загадку зоны. Персонаж знал одного или нескольких торговцев, которые имели набор заданий, которые они генерировали, исходя из карты аномальной активности и запроса организаций, которые хотели нажиться на найденных в зоне артефактах. Выполнение задания приближало персонажа к его цели. На тот момент был только один тип заданий – принести артефакт. Персонаж брал задание на поиск артефакта, шёл в место, где он приблизительно мог быть, судя по данным задания, если находил – возвращался к торговцу, торговал с ним и выбирал новое задание. По пути он мог встретить противников и воевать с ними, при этом расчёт в оффлайне вёлся на манер TBS: каждый противник делал ход по очереди, результат действия вычислялся по формуле + рандом. В результате, получалось, что иногда один от другого мог сбежать, иногда кто-то кого-то убивал, а иногда они даже друг друга не замечали или не решались нападать. Если же персонаж был сталкером и встречал нейтралов или друзей, то торговал с ними по разработанной схеме торговли. Всё это работало как в оффлайновой, так и в онлайновой схемах.
 
'''Дмитрий Ясенев''': У персонажа в игре всегда есть цель. На ранних версиях симулятора это была цель разгадать загадку зоны. Персонаж знал одного или нескольких торговцев, которые имели набор заданий, которые они генерировали, исходя из карты аномальной активности и запроса организаций, которые хотели нажиться на найденных в зоне артефактах. Выполнение задания приближало персонажа к его цели. На тот момент был только один тип заданий – принести артефакт. Персонаж брал задание на поиск артефакта, шёл в место, где он приблизительно мог быть, судя по данным задания, если находил – возвращался к торговцу, торговал с ним и выбирал новое задание. По пути он мог встретить противников и воевать с ними, при этом расчёт в оффлайне вёлся на манер TBS: каждый противник делал ход по очереди, результат действия вычислялся по формуле + рандом. В результате, получалось, что иногда один от другого мог сбежать, иногда кто-то кого-то убивал, а иногда они даже друг друга не замечали или не решались нападать. Если же персонаж был сталкером и встречал нейтралов или друзей, то торговал с ними по разработанной схеме торговли. Всё это работало как в оффлайновой, так и в онлайновой схемах.
  
Планировалось, что потом количество типов заданий увеличится, а поведение персонажа станет более разнообразным за счёт его повседневных потребностей во сне и пище. Мы даже планировали, что наши персонажи смогут сами разгадать загадку Зоны раньше игрока, если соберут определённое количество информации.
+
Планировалось, что потом количество типов заданий увеличится, а поведение персонажа разнообразится за счёт его повседневных потребностей во сне и пище. Мы даже планировали, что наши персонажи смогут сами разгадать загадку Зоны раньше игрока, если соберут определённое количество информации.
  
Но потом мы поменяли схему генерации заданий. Персонажи в игре стали получать задания не от торговцев, а от т.н. [[smart terrain]]-ов (это не то же самое, что в симсах). Т.е. теперь жизнь персонажа выглядела таким образом, что он выбирал задание, сгенерированное каким-то smart terrain-ом, и шёл на место, указанное в нём. После прихода ему начислялись очки, а smart terrain забирал персонажа под свой контроль на какое-то время. Находясь под контролем smart terrain-а, персонаж выполнял работы, которые были доступны, и которым он подходил с учётом приоритетов. Так в игре появились базы группировок, сталкеры возле костров и т.д.
+
Но потом мы поменяли схему генерации заданий. Персонажи в игре стали получать задания не от торговцев, а от т.н. smart terrain-ов (это не то же самое, что в симсах). Т.е. теперь жизнь персонажа выглядела таким образом, что он выбирал задание, сгенерированное каким-то smart terrain-ом, и шёл на место, указанное в нём. После прихода ему начислялись очки, а smart terrain забирал персонажа под свой контроль на какое-то время. Находясь под контролем smart terrain-а, персонаж выполнял работы, которые были доступны, и которым он подходил с учётом приоритетов. Так в игре появились базы группировок, сталкеры возле костров и т.д.
  
Т.о. миграции персонажей с места на место и передвижение их между уровнями были обусловлены сменой задания.
+
Т.о. миграции персонажей с места на место, передвижение их между уровнями всё это было обусловлено сменой задания.
  
  
'''Вопрос''': Расскажите нам об интеллекте на уровне существа.
+
'''Вопрос''': Расскажите нам об интеллекте на уровне существа?
  
 
'''Дмитрий Ясенев''': По поводу интеллекта на уровне существа – стоит рассмотреть две модели: оффлайновую и онлайновую отдельно, хотя они и имеют общее.
 
'''Дмитрий Ясенев''': По поводу интеллекта на уровне существа – стоит рассмотреть две модели: оффлайновую и онлайновую отдельно, хотя они и имеют общее.
  
Оффлайновый интеллект существа выглядит очень просто: если нет выбранного задания – попробовать его выбрать. Если выбрать не получилось – бесцельно бродить. Если есть задание – идти на место его выполнения. Когда персонаж под контролем смарттеррейна, ему могут быть отданы дополнительные команды на перемещение, но никакие другие действия он не выполняет.
+
Оффлайновый интеллект существа очень просто: если нет выбранного задания – попробовать его выбрать. Если выбрать не получилось – бесцельно бродить. Если есть задание – идти на место его выполнения. Когда персонаж под контролем смарт террэйна, ему могут быть отданы дополнительные команды на пермещение, но никакие другие действия он не выполняет.
  
 
Онлайновый интеллект персонажа состоит из трёх слоёв:
 
Онлайновый интеллект персонажа состоит из трёх слоёв:
Строка 77: Строка 77:
 
Именно поэтому мы решили не использовать GOAP для задания поведения монстров, т.к. они существенным образом зависели от анимаций, которые не могли быть прерваны или «погашены». Поэтому мы использовали для них иерархический КА, хотя, на самом деле, он не решил проблему немгновенного окончания действия. В приквеле мы получили решение этой проблемы, переместив часть логики в низкоуровневые контроллеры: высокоуровневая логика задает цели низкоуровневой. Благодаря этому, мгновенное изменение оператора в высокоуровневой логике не означает мгновенное изменение действия на низком уровне.
 
Именно поэтому мы решили не использовать GOAP для задания поведения монстров, т.к. они существенным образом зависели от анимаций, которые не могли быть прерваны или «погашены». Поэтому мы использовали для них иерархический КА, хотя, на самом деле, он не решил проблему немгновенного окончания действия. В приквеле мы получили решение этой проблемы, переместив часть логики в низкоуровневые контроллеры: высокоуровневая логика задает цели низкоуровневой. Благодаря этому, мгновенное изменение оператора в высокоуровневой логике не означает мгновенное изменение действия на низком уровне.
  
Есть также нюанс в комбинировании двух методов задания логики. Сначала мы решили использовать мотивационные графы для уменьшения нагрузки на планировщик GOAP-а. Однако, оказалось, что планировщик отлично справляется со своей задачей и поиск никогда не посещает более 200 вершин. Кроме того, задание топологии графа для выбора целей переносит часть работы планировщика на создателя графа. В итоге мы перестали использовать мотивационные графы, т.к. удобнее задавать логику одним способом. Разные цели использовались только для живых и мертвых персонажей (для зажатия спускового крючка во время смерти).
+
Есть также нюанс в комбинировании двух методов задания логики. Сначала мы решили использовать мотивационные графы для уменьшения нагрузки на планировщик GOAP-а. Однако, оказалось, что планировщик отлично справляется со своей задачей и поиск никогда не посещает более 200 вершин. Кроме того, задание топологии графа для выбора целей переносит часть работы планировщика на создателя графа. В итоге мы перестали использовать мотивационные графы, т.к. удобнее задавать логику одним способом. Разные цели использовались только для живых и мертвых персонажей (для зажатия курка во время смерти).
  
 
Низкоуровневые контроллеры отвечают за выбор анимаций, передвижение, управление объектами, проигрыванием звуков, управление ориентацией персонажей. Их реализация не представляет особого интереса, кроме, разве что, управления объектами, для которого мы использовали GOAP (и очень успешно). Было бы интересно посмотреть на менеджер низкоуровневых контроллеров, который использовал бы частично упорядоченное планирование для управления. Тут, конечно, не стоит забывать, что скорость нам очень важна, т.к. обычно низкоуровневые контроллеры обновляются несколько раз в секунду. С другой стороны, такое решение взяло бы на себя все внутренние взаимодействия между котроллерами. Возможно, такое планирование стоит использовать не только для низкоуровневых контроллеров, но и для задания всей логики персонажа, как уже обсуждалось [http://aigamedev.com/open/review/crysis-animation-integration/ здесь].
 
Низкоуровневые контроллеры отвечают за выбор анимаций, передвижение, управление объектами, проигрыванием звуков, управление ориентацией персонажей. Их реализация не представляет особого интереса, кроме, разве что, управления объектами, для которого мы использовали GOAP (и очень успешно). Было бы интересно посмотреть на менеджер низкоуровневых контроллеров, который использовал бы частично упорядоченное планирование для управления. Тут, конечно, не стоит забывать, что скорость нам очень важна, т.к. обычно низкоуровневые контроллеры обновляются несколько раз в секунду. С другой стороны, такое решение взяло бы на себя все внутренние взаимодействия между котроллерами. Возможно, такое планирование стоит использовать не только для низкоуровневых контроллеров, но и для задания всей логики персонажа, как уже обсуждалось [http://aigamedev.com/open/review/crysis-animation-integration/ здесь].
  
  
'''Вопрос''': Поскольку в финальной игре был сюжет, значит некоторые территории в игре, были скриптоваными, в традиционной манере. Не могли бы вы рассказать нам как вы объединили систему А-Life со скриптами?
+
'''Вопрос''': Поскольку в финальной игре был сюжет, значит некоторые территории в игре, были скриптоваными, в традиционной манере. Не могли бы вы рассказать нам как вы объединили систему А-life со скриптами?
  
'''Дмитрий Ясенев''': Как уже было сказано выше, задания в игре генерируются [[smart terrain]]-ами. Это же касается и сюжетной линии. Сюжетные задания имеют больший приоритет. Кроме того, сюжетные области ограничены т.н. [[space restrictor]]-ами. Их задача заключается в том, чтобы сюжетные персонажи не разбегались слишком далеко, а несюжетные персонажи не ломали сюжетные элементы. Т.е. в этом доля контроля над симуляцией есть, и доля немалая. С другой стороны, после прохождения игроком сюжетной сценки, сюжетные персонажи становятся обычными и следуют обычным правилам, т.е. выбирают себе задания и идут их выполнять в соответствующие смарт террэйны, а с самой зоны снимаются все ограничения и на неё разрешается выдавать задания.
+
'''Дмитрий Ясенев''': Как уже было сказано выше, задания в игре генерируются smart terrain-ами. Это же касается и сюжетной линии. Сюжетные задания имеют больший приоритет. Кроме того, сюжетные области ограничены т.н. space restrictor-ами. Их задача заключается в том, чтобы сюжетные персонажи не разбегались слишком далеко, а несюжетные персонажи не ломали сюжетные элементы. Т.е. в этом доля контроля над симуляцией есть, и доля немалая. С другой стороны, после прохождения игроком сюжетной сценки, сюжетные персонажи становятся обычными и следуют обычным правилам, т.е. выбирают себе задания и идут их выполнять в соответствующие смарт террэйны, а с самой зоны снимаются все ограничения и на неё разрешается выдавать задания.
  
  
Строка 118: Строка 118:
 
'''1.''' Не изобретать колёса. Используйте Интернет для поиска решений возникших у вас проблем.
 
'''1.''' Не изобретать колёса. Используйте Интернет для поиска решений возникших у вас проблем.
  
'''2.''' Чётко знать, какую игру вы делаете, что в ней будет и чего не будет, использовать прототипирование для того, чтобы избежать большого количества фич, которые не войдут в релиз.
+
'''2.''' Чётко знать какую игру вы делаете, что в ней будет и чего не будет, используйте прототипирование для того, чтобы избежать большого количества фич, которые не вошли в релиз.
  
'''3.''' Отлаживайте персонажей с удобными инструментами: каждая компонента должна иметь отладочную отрисовку/режим/экран. Рисуйте пути (все итерации, все стадии сглаживания), рисуйте проверки на видимость, чтобы знать, почему персонаж не видит, рисуйте информацию об укрытиях и т.д. Для отладки поведения персонажей мы создали отладочный экран со всеми данными, так что мы можем легко выбрать персонажа и выяснить что с ним не так. Пауза и замедление времени бесценны для отладки анимаций/передвижения/ориентации.
+
'''3.''' Отлаживайте персонажей с удобными инструментами: каждая компонента должна иметь отладочную отрисовку/режим/экран. Рисуйте пути (все итерации, все стадии сглаживания), рисуйте проверки на видимость, чтобы знать почему персонаж не видит, рисуйте информацию об укрытиях и т.д. Для отладки поведения персонажей мы создали отладочный экран со всеми данными, так что мы можем легко выбрать персонажа и выяснить что с ним не так. Пауза и замедление времени бесценны для отладки анимаций/передвижения/ориентации.
  
 
'''4.''' Пусть программисты программируют, а дизайнеры – дизайнят. Дизайнер – плохой программист, а программист – плохой дизайнер. Это может быть проблемой при использовании скриптов. Пусть люди занимаются тем, в чём они сильны. Вместо обучения дизайнеров программированию, сделайте WYSIWYP редактор с кучей настроек.
 
'''4.''' Пусть программисты программируют, а дизайнеры – дизайнят. Дизайнер – плохой программист, а программист – плохой дизайнер. Это может быть проблемой при использовании скриптов. Пусть люди занимаются тем, в чём они сильны. Вместо обучения дизайнеров программированию, сделайте WYSIWYP редактор с кучей настроек.

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии GNU Free Documentation License 1.3 или более поздняя (см. xrWiki:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)