Обновление Rust: Сделаны из другого теста
Вышло крупнейшее за последние годы обновление, посвящённое самому игроку: модель персонажа после почти 10 лет службы заменили целиком — новый скелет, более реалистичные пропорции, переработанные лица, причёски и одежда, а также более живые анимации.
Также впервые за долгое время в игру добавили новую высокоуровневую экипировку — баллистическую броню, боевую униформу BDU и винтовку M16A2 со стрельбой очередями по три патрона, причём всё это нельзя скрафтить, только найти в луте. Помимо этого, состоялся переход на Unity 6, сделан первый шаг к собственной навигационной сетке, улучшена серверная проверка попаданий, а Premium переименовали в Premium Access Pass. Вышли и платные дополнения — индустриальный набор декора и безлучный арбалет, а также плюшевый Wumpus в коллаборации с Discord.
Обновление игрока
Разработчики полностью переработали модель персонажа — с нуля.
Сюда входят улучшенные меши и материалы, более реалистичные пропорции на новом скелете, расширенный набор сидов для лиц и причёсок, а также давно назревшая доработка практически всего, что связано с персонажем.
Старая модель верой и правдой прослужила почти 10 лет, но уже какое-то время заметно отставала от остальной игры. Дело не только в том, что визуально она показывала свой возраст — куда важнее, что она не давала команде взяться за более серьёзные улучшения персонажей и анимаций и тормозила внедрение будущих возможностей. Прошлые попытки её подлатать всякий раз оборачивались полумерами: в рамках старых пропорций и скелета сделать можно было лишь ограниченное число вещей. В какой-то момент стало ясно, что единственный реальный путь вперёд — вырвать всё это с корнем и отстроить заново, как следует.
Помимо новой базовой модели, команда также:
- Увеличила количество вариаций голов в игре — теперь у каждой уникальные материалы и дополнительные детали вроде ресниц и улучшенного освещения глаз.
- Переработала и расширила набор причёсок и бород, применив новые анизотропные шейдеры, чтобы волосы выглядели естественнее.
- Обновила всю одежду под новый скелет и пропорции, заодно освежив множество старых ассетов и устранив ряд давних проблем.
- Модернизировала художественный конвейер, отвечающий за модель персонажа, — теперь выпускать будущие правки и улучшения станет гораздо проще.
Лицо персонажа изменится, но сиды расы и пола остались нетронутыми — так что разработчики надеются, что для тех, кто за годы прикипел к своему случайному сиду, это не станет большим потрясением. Модель будут продолжать дорабатывать и после релиза, а в планах есть отдельное обновление с настройкой внешности.
Это была колоссальная работа, тем более что велась она параллельно с обычной разработкой и ежемесячными обновлениями. Операция на открытом сердце над одной из самых взаимосвязанных частей Rust, без остановки выпуска патчей, ожидаемо далась нелегко.
К концу года команда рассчитывает внедрить редактор персонажа. Как именно он будет устроен, пока обсуждается внутри студии — подробностями поделятся в будущих блогах.
Производительность
Разработчики понимают: слова «улучшенная графика» и «дополнительные детали» способны насторожить, когда речь заходит о производительности. За этим пристально следили на протяжении всей разработки. Вместе с визуальными улучшениями команда основательно прошлась по своим инструментам и конвейерам — это открыло возможность для оптимизаций, которые на старой системе были недоступны.
Внутренние метрики пока выглядят обнадёживающе, и после релиза за производительностью продолжат внимательно наблюдать.
Улучшенные системы анимации
Одной из главных целей новой модели персонажа было дать команде прочный фундамент для доработки анимаций в Rust. Теперь разработчики приступают к улучшению анимационных систем, чтобы движения персонажа выглядели менее механически и более живо.
Одна из ключевых проблем прошлого заключалась в том, что все анимации персонажа были собраны в единый монолитный конечный автомат. Это более 250 анимаций плюс отдельные наборы под большинство видов оружия. Обновлять такой автомат мучительно и легко наошибаться: его делят между собой все виды оружия и всё, на чём можно ездить, — поэтому изменение одного перехода между анимациями могло непредсказуемо аукнуться в совершенно других ситуациях в игре.
Чтобы это решить, команда создала новый инструмент-подсистему, который позволяет добавлять отдельную, заточенную под конкретную ситуацию логику анимаций поверх основной. Вместо того чтобы и дальше раздувать гигантский контроллер аниматора всё новыми анимациями, теперь можно создавать небольшие самостоятельные анимационные поведения и подключать их в конкретных контекстах.
Звучит мудрёно, поэтому проще на живом примере — на скромном факеле. Он есть у всех с самого старта, и каждый хоть раз зажигал его ночью и тут же погибал. С его анимацией было связано несколько проблем, которые раньше было непросто решить. Хотя факел держат только в правой руке, старая система анимации умела перехватывать управление лишь всей верхней частью тела разом — из-за чего левая рука всегда оставалась скованной и деревянной. Аниматор верхней части тела к тому же ничего не знал о перемещении персонажа и не мог реагировать на бег, прыжки и тому подобное (да и будь он в курсе, городить целый набор анимаций бега и прыжков ради одного факела — расточительство).
Решением стала новая подсистема, которая создаёт отдельный конечный автомат, применяемый только к правой руке. Благодаря этому на левой руке сохраняются анимации бега и движения. Заодно добавили поддержку подмешивания левой руки в тех анимациях, где она нужна, — например, когда персонаж зажигает факел.
Пока команда выкатывает это лишь в нескольких небольших местах, чтобы обкатать и убедиться в стабильности, но в дальнейшем эти новые инструменты позволят работать быстрее, плодить меньше анимационных багов и получать более качественный результат.
Баллистическая броня
Впервые за очень долгое время в Rust появляется новый высокоуровневый комплект брони.
Баллистическая броня даёт больше защиты, чем существующие крафтовые аналоги, но есть нюанс: скрафтить её нельзя. Хочешь заполучить — придётся искать. По уровню защиты она сопоставима с металлической бронёй с пластинами.
Вместе с ней вводится боевая униформа (Battle Dress Uniform, BDU). Как и баллистическая броня, BDU только выпадает из лута и крафту не поддаётся. Она даёт чуть лучшую защиту, чем имеющиеся варианты одежды, но в чём-то приходится идти на компромисс.
Оба комплекта призваны расширить прогрессию снаряжения в поздней игре и добавить ценных целей для поиска лута. Если нужна лучшая экипировка из доступной, придётся выбираться наружу и драться за неё.
Новое оружие: M16A2
M16A2 — винтовка армейского класса, которая попадается только в топовом луте и не крафтится. Она построена вокруг режима стрельбы очередями по три патрона, отличается превосходной точностью и высокой скорострельностью, что делает её особенно эффективной в перестрелках на средней дистанции.
Чтобы уравновесить потенциальный урон от очередей, M16A2 наносит меньше урона за выстрел по сравнению с LR-300.
Как и баллистическая броня с BDU, M16A2 — ещё один ценный предмет, доступный только в луте, за которым придётся выйти в мир и побороться. Тенденция, как видишь, прослеживается.
Важно: проблема с производительностью у мышек с высокой частотой опроса
Обновление до Unity 6 изменило способ обработки ввода с мыши. Мышки с высокой частотой опроса (1000 Гц и выше) теперь создают серьёзную нагрузку на процессор и приводят к просадкам кадров.
Снизьте частоту опроса мыши ниже 1000 Гц через фирменное ПО производителя (Logitech G HUB, SteelSeries GG и тому подобное).
Разработчики ищут полноценное решение со своей стороны. Приносим извинения за неудобства.
Доработки анимаций
Согласование анимаций
Где это было возможно, команда воспользовалась случаем и привела анимации от третьего лица в соответствие с тем, что происходит в виде от первого лица. Многие старые анимации сильно расходились — и по самим движениям, и по таймингу.
Больше уникальных анимаций
Часть оружия из-за нехватки времени делила анимации между собой, и подходили они не всегда удачно. Теперь под каждое оружие создано больше отдельных, заточенных именно под него анимаций.
Стойка в три четверти
Изначальная цель была уйти от прицеливания «лицом вперёд»: оно хоть и работало, но выглядело ужасно. К тому же при нём неизбежно проступали сквозь модель такие элементы, как приклад, — ведь верхняя часть тела не может «освободить место» под оружие, которое обязано смотреть строго в цель.
В этом обновлении команда выбрала стойку, более близкую к стрелковой стойке Уивера, чтобы сгладить часть перечисленных проблем. Выглядит она естественнее, и, что важно, в ней больше разворота корпуса и наклона бёдер.
Просмотр скинов
В этом месяце средство просмотра скинов получило небольшое улучшение. Теперь скины можно рассматривать прямо в руках персонажа — сразу из магазина или из меню инвентаря Steam.
Улучшенная серверная проверка попаданий
Нередко бывает так: попадаешь по игроку в воздушном шаре или на лодке, а в ответ получаешь злосчастное «projectile invalid» — это сервер отклонил твоё попадание.
В этом месяце разработчики занялись улучшением проверки попаданий по игрокам, привязанным к другим объектам. Теперь при проверке учитывается предыдущее положение объекта-носителя — благодаря этому выстрелы должны засчитываться, а опыт игры станет приятнее для всех.
На серверах Facepunch это будет включено сразу. Если всё пройдёт гладко, выйдет хотфикс, который включит настройку по умолчанию на всех серверах. Изменить этот параметр самостоятельно можно через консольную переменную antihack.parenthistory.
Базовые улучшения производительности
Переработка Pool
Команда полагается на внутреннюю утилиту под названием Pool, которая переиспользует объекты и помогает избегать лишних выделений памяти, — это критично, чтобы не нагружать сборщик мусора. А раз утилита критична, она используется по всей кодовой базе.
Пару месяцев назад разработчик обнаружил, что Pool становится узким местом при попытке внедрить многопоточную пакетную обработку задач (например, ежекадровую отправку снапшотов сущностей игрокам). Ради базовой защиты от состояния гонки между потоками утилита использует мьютекс, и в горячих циклах за этот мьютекс возникает серьёзная конкуренция, которая тормозит все рабочие потоки.
Поэкспериментировав с разными реализациями, разработчик остановился на слегка «неточном» (fuzzy) lock-free решении (ниже обозначено как FuzzyCB). По производительности в одном потоке и в сценарии «один производитель — один потребитель» (Single-Producer-Single-Consumer) оно не уступает ConcurrentBag, а в сценарии «много производителей — один потребитель» (Multi-Producer-Single-Consumer) обгоняет его.
Поскольку решение «неточное», у него есть недостаток: оно никогда не знает точно, сколько объектов лежит в пуле. Из-за этого при высокой конкуренции за пул, когда он близок к заполнению, он может время от времени «терять» объекты. Доля потерь невелика: в одном тесте, где переиспользовалось 32 000 объектов с 32 потоков, потерялось около 0,15 %, то есть 48 объектов.
Сейчас решение задействовано по всей кодовой базе, и разработчик опирается на него в режиме `UsePlayerUpdateJobs 3`, чтобы пропускать предварительное выделение объектов. Если на серверах или у клиентов из-за этого возникнут проблемы, можно вернуться к исходной реализации Pool командой `pool.usemutexpool 1`. Как только новый пул подтвердит свою стабильность, запасной вариант уберут.
Больше StringView
В рамках работы по устранению разрозненных выделений памяти разработчик перевёл часть системы консольных команд на использование StringView — а именно разбор и хранение входящих команд и их аргументов. Большинство интерфейсов отдают аргументы как StringView с привычными методами преобразования, но на случай, если какие-то моды по-своему хитро обрабатывают аргументы через строки, оставлен совместимый вызов `GetString`.
Хотя изменение API болезненно для серверных модов, эта переработка позволила избавиться от более чем 60 выделений памяти и свыше 4 КБ при вызове команды с шестью аргументами, так что игра стоит свеч. Чтобы переход прошёл чуть менее болезненно, StringView оставили похожим по API и на String, и на ReadOnlySpan. В ближайшие пару месяцев разработчик продолжит распространять его по коду и устранять разные шероховатости в его устройстве.
Что под капотом
Что переработка персонажа дала команде на техническом уровне? Главное — новый скелет (риг). Свобода создать его с нуля позволила добиться более реалистичных пропорций и выбрать более естественную базовую позу, благодаря чему художники по персонажам могут лепить модели, лучше подходящие для деформации. На смену 12-летнему ригу из Maya пришёл куда более надёжный, мощный и не устаревающий со временем инструмент. В новый скелет уже заложены вспомогательные кости скручивания и кости кистей: в Unity их потенциал пока раскрыть нельзя, но в планах это конечная цель. В сумме всё это означает, что создавать анимации от третьего лица команде стало приятнее, а качество результата выросло.
Заодно стало проще работать сообща с художниками по персонажам, которые тоже трудятся в Maya. Раньше при создании одежды красивую модель приходилось калечить и искажать её пропорции, подгоняя под старого персонажа, — теперь этот шаг наконец убрали, и одежда выглядит так, как задумано. Все ассеты одежды загружаются прямо в Maya, с поиском и удобным экспортом, так что команды персонажей и анимаций работают с одними и теми же исходниками.
Поправили и оружие: многие стволы держались на костыльных смещениях из тех времён, когда не было отдельной кости для предметов. Теперь всё оружие крепится напрямую к ней, а смещения убрали.
А вот логика анимаций осталась почти прежней — и осознанно. Опыт недавних игр, бравшихся за похожие переработки, показал: в такой игре, как Rust, игрокам нужен мгновенный отклик, а не плавные «шелковистые» переходы между действиями. Аниматору на них любоваться приятно, но аудитория тех проектов восприняла подобные нововведения скорее как помеху. Так что обновление игрока осталось таким же отзывчивым, как и раньше, — если тебя всё ещё убивают, винить остаётся только себя. Приятные мелочи в будущем добавят (одна такая описана в разделе Джаррида про подсистему), но любые изменения будут соизмерять с привычным игрокам ощущением Rust и вводить их постепенно, а не одним огромным апдейтом, который шокирует систему.
Новый navmesh
В этом месяце студия делает первый шаг к тому, чтобы заменить навигационную сетку (navmesh) Unity на собственную. Включить её администраторы могут стартовым аргументом -useNewNavmesh при запуске сервера — по умолчанию она пока отключена. Посмотреть, как сетка выглядит в игре, помогает команда rustNav.draw. Всё это открывает простор для улучшения производительности NPC и исправления давних багов. На основе той же сторонней библиотеки Recast, что использует Unity (а также Unreal, Godot и многие другие движки), — разница лишь в том, что теперь у команды полный контроль над ней, без ограничений «чёрного ящика» Unity-интеграции.
Что это даст игрокам в будущем:
- Животные и учёные смогут заходить на базы игроков и перемещаться по ним. Пока — только на простую базу без дверей и только при включённой новой сетке. Это задел под будущее содержание овец, коров и собак.
- Новые животные будут реже погибать сами по себе (раньше это случалось из-за того, что Unity не справлялась с поиском пути на некоторых выпуклых и вогнутых участках рельефа).
- Появится возможность обновить ИИ учёных на грузовом корабле и экскаваторе — прежде это было невозможно, поскольку требовалась подвижная навигационная сетка.
- Новые учёные будут лучше и «дешевле» заходить с флангов (за счёт особой логики поиска пути, которая делает прямые маршруты менее предпочтительными).
По производительности:
- Сетка строится в фоне после старта сервера, а при перезапусках мгновенно загружается с диска.
- Препятствия вроде фундаментов игроков обрабатываются в отдельных потоках с ограничением по нагрузке и не бьют по частоте кадров (у способа Unity была заметная постоянная нагрузка).
- Максимальное время одного запроса на поиск пути ограничено, так что один NPC не сможет вызвать лаг-спайк долгим запросом.
- В поисках укрытия или позиции для выглядывания новые учёные смогут быстро отсеивать недостижимые точки, не тратясь на дорогие запросы поиска пути.
Premium Access
Premium переименовывается в Premium Access Pass. Это чисто смена названия, без каких-либо функциональных изменений: если стоимость твоего инвентаря в Steam составляет 15 долларов или больше, доступ к серверам Premium Access сохраняется ровно как прежде.
Смена названия — часть подготовки к будущим планам по монетизации (увы). Менять работу премиума студия не собирается: как уже говорилось в прошлых блогах, он неплохо справляется с отсевом читеров, и игроков настоятельно призывают пользоваться премиум-серверами.
А само название Rust Premium вернут для новой системы монетизации, которую планируют запустить ближе к концу года. Это не боевой пропуск и не VIP-система, а скорее ежемесячная добровольная подписка на дополнительные скины и бонусы.
Детали ещё дорабатывают и поделятся ими до запуска — чтобы все могли рассказать, насколько всё плохо (это камень в огород Reddit).
Новый предмет для мастерской: автоматическая турель
Объект этого месяца, для которого можно делать скины в мастерской, — автоматическая турель. Постоянный спутник многих баз в Rust наконец готов принять немного любви от сообщества скинов. Главное — следить, чтобы при покраске «рабочего конца» она была настроена не враждебно.
Чтобы сделать свой скин для турели, нужно зайти во внутриигровую мастерскую, найти размещаемый предмет «автоматическая турель», скачать файл модели и добавить собственные материалы. Приём работ от сообщества откроется 11 июня.
Индустриальный набор декора
Платный набор из 20 предметов в индустриальном стиле: декоративные размещаемые объекты, утилитарные хранилища и инструменты. В него входят промышленные полки трёх видов (двойная, половинная и настенная — им, в отличие от прочего, можно задавать цвет), горизонтальные и вертикальные бочки-хранилища, скины для факела, автоматической турели, большой и электрической печей, гаражных ворот с плексигласовыми окошками, 6 вариантов обоев для бетонного пола, а также набор спреев и эмодзи. Доступен во внутриигровом магазине и в магазине предметов Rust в Steam.
Безлучный арбалет
Отдельный платный скин для арбалета — собранный явно кем-то обиженным и без особой оглядки на технику безопасности, из подобранного в мастерской хлама и с безлучной системой шкивов. Продаётся во внутриигровом магазине и в магазине предметов Rust в Steam.
Discord x Rust — плюшевый Wumpus
Первая в своём роде коллаборация с Discord: их маскота Wumpus теперь можно поставить у себя на базе в виде размещаемой плюшевой игрушки. Её можно вращать и ставить друг на друга, а рядом с ней персонаж получает 70 % комфорта. Плюшевый Wumpus — единичное исключение, доступное только в магазине Discord: купить его нужно напрямую через Discord, после чего предмет привяжется и разблокируется в инвентаре Steam.
См. также:


