Rust — трейлер с обновлениями по морской тематике

▶ YouTube

Лодки, созданные игроками

Лодки, созданные игроками, уже здесь — это новый способ исследовать моря, включая глубоководные районы!

Разместите в воде новую развертываемую станцию постройки судов и приступайте к строительству вместе со своими товарищами по кораблю! Воспользуйтесь новым чертежом судна, чтобы построить судно своей мечты, используя новый набор строительных блоков, предназначенных специально для судов.

Добавьте штурвал, якорь, паруса, двигатели, доски, трапы и пушки, чтобы завершить сборку своего судна и отправиться в глубокое море!

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

Обязательно установите код блокировки на штурвале, чтобы предотвратить нежелательный доступ или кражу вашей новой блестящей лодки.

На ваших лодках можно размещать обычные развертываемые объекты. Если они работают на буксире, то будут работать и здесь.

Нужно что-то изменить, после того как вы поняли, что ваша лодка только кружится на месте? Воспользуйтесь режимом «Развертывание и редактирование» (недоступно в «Глубоком море»), чтобы быстро и легко развернуть станцию строительства лодок вокруг вашей лодки.

Удачи в строительстве и исследовании морей!

Новые развертываемые объекты для лодок

Чтобы ваше судно было готово к плаванию, мы добавили несколько новых развертываемых объектов — специально для вашей лодки!

Станция постройки лодок

Станцию строительства лодки можно разместить в глубокой воде; она используется для строительства и редактирования вашей лодки.

План строительства

План строительства лодки похож на знакомый и любимый вами планировщик строительства, но предназначен именно для лодок.

Паруса

Лист прочной ткани, оснащённый такелажем для улавливания ветра и обеспечения движения лодки вперёд.

Руль

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

Двигатель

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

Якорь

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

Пушка

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

Небольшой наклон

Соединяйте промежутки и создавайте точки быстрого доступа. Идеально подходит для абордажа других кораблей или выхода на берег с воды.

Доска

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

Глубокое море

Открытое море — это новый прибрежный регион, куда можно добраться на лодках. Это место с высоким риском, высокими наградами и намеренно суровыми условиями.

Попасть туда можно, отплыв к краю карты на прочном судне, например, на судах, построенных игроками, на надувных катерах (RHIB) или на новых катерах PT.

Это не место для жизни: здесь нельзя строить, и ничего не возрождается. Кто первый приплыл, тот и получил. Глубокое море будет открываться и закрываться периодически, как мировое событие.

Внутри вы сможете исследовать новый контент, подробно описанный ниже в этом блоге:

  • Тропические острова
  • Плавучие города
  • Корабли-призраки
  • Лодки, управляемые учёными

У нас много планов по расширению глубоководной зоны и использованию её в качестве моста между мирами.

Корабли-призраки

Подобно памятникам, «Корабли-призраки» — это неподвижные суда, разбросанные по всему глубоководью и наполненные добычей, которую игроки могут собирать, плавая на своих лодках.

Каждый «корабль-призрак» охраняется учёными — как на самом судне, так и в виде патрулей поблизости, которые будут пытаться не пустить вас на борт. На некоторых «кораблях-призраках» также находятся запертые ящики, которые вам нужно будет взломать, находясь под давлением других игроков и судов учёных.

Мы надеемся, что «корабли-призраки», наряду с другими местами с добычей, такими как тропические острова, станут достаточным стимулом для частых посещений глубоководья. 

Плавучие города в глубоком море

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

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

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

В центре каждого плавучего города находится казино «Deep Deck» — уютное место, предлагающее развлечения и отдых всем уставшим морякам. Здесь вы можете встретить других выживших, расслабиться в бассейне, насладиться музыкой и по душе поиграть на свои отходы. 

Только не забывайте вести себя прилично, пока вы там — устройте беспорядки, и охранные турели напомнят вам, почему это была плохая идея.

Острова в глубоком море

В течение многих лет океан был лишь голубой пустотой между вами и нефтяными платформами. В этом обновлении мы представляем совершенно новый биом в Глубоком море — «Тропические острова».

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

Их полупроцедурная природа обеспечит разнообразные впечатления. На некоторых из них могут быть старые руины, на других — клад руды — или и то, и другое.

Но будьте осторожны. Вы не единственный, кто ищет там удачу.

ЛОДКИ УЧЁНЫХ

Мы добавили новую лодку — катер PT. Её можно встретить только в Глубоком море — она медленнее, чем надувная лодка RHIB, и потребляет больше топлива, но при этом более прочная и обладает мощным вооружением.

Будьте осторожны: глубоководье кишит новыми лодками ученых.

Эти суда (включая надувные катера и новую лодку PT) укомплектованы экипажами ученых, которые бродят по глубоководью скоординированными группами в поисках игроков для сражения. Вы можете обнаружить их, охраняющих взломанный ящик на борту корабля-призрака.

С каждого катера можно избавиться от ученых и угнать его.
Интересно, что вы найдете на борту?

Каждый катер PT оснащён двумя турелями. Одна из них вооружена двумя пулемётами калибра 50, а другая — одним более точным пулемётом того же калибра. Каждую из них можно перезаряжать стандартными винтовочными патронами калибра 5,56.

Обновление RHIB

RHIB нуждался в небольшом уходе, и нет лучшего момента для этого, чем обновление «Морские силы». Модель и текстуры были обновлены, а также добавлена новая модель ящика для хранения.

Теперь надувная лодка RHIB оснащена работающим компасом и экранами с отображением карты, что поможет вам ориентироваться в океане.

Новый ИИ ученых на нефтяных платформах и в море

Если вам доводилось сражаться со многими учёными, вы знаете: попытки прокрасться или обойти их с фланга — верный способ погибнуть.

Они всегда знают, где вы находитесь, и мгновенно развернутся на 180 градусов и телепортируют вас, если вы попытаетесь проявить хитрость и перехитрить их.

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

Из-за этого захват памятника, охраняемого учёными, превращается в испытание ресурсов с низким потолком мастерства.

Всё сводится к следующему: знаете ли вы «чиз» и хватит ли вам патронов и бинтов, чтобы пробиться через них? 

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

Их можно отличить по морской камуфляжной форме и квадратному козырьку.

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

Это означает, что вы можете выманить их, выглянув из укрытия или издавая шум, а затем обойти их сзади и застрелить.

Это еще больше облегчается их более медленным временем реакции.

Если вы появитесь под углом, которого они не ожидали, они будут застигнуты врасплох, и тогда вы сможете застрелить их, прежде чем они успеют даже среагировать.

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

Они также будут гораздо осторожнее в отношении снайперов: если их подстрелят или они услышат выстрел, все сразу укроются и будут ждать.

Мы будем внимательно следить за вашими отзывами и продолжим дорабатывать их.

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

МОДЕЛЬ ВИДА В ПЛАНИРОВЩИКЕ СТРОИТЕЛЬСТВА

При строительстве или размещении объекта в планировщике всегда была модель от третьего лица, видимая всем остальным, но никогда не было модели от первого лица. 

Мы считаем, что было бы неплохо, чтобы то, что видят остальные, совпадало с тем, что видите вы, поэтому мы добавили модель вида от первого лица в планировщик.

Новые миссии

В обновлении этого месяца у нас есть 5 новых миссий на морскую тематику.

Их можно получить у различных НПЦ — как новых, так и уже существующих. Некоторые из них требуют от вас отправляться в глубины океана, а другие — оставаться на материке.

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

Эта работа также включает в себя несколько исправлений и улучшений, повышающих качество жизни (QOL), в существующих миссиях и диалогах с NPC, а также соответствующие оптимизации фоновых процессов.

Крупные нефтяные платформы

Теперь у «Большой нефтяной платформы» будут появляться лодки ученых с ящиком — это создаст игрокам дополнительные трудности при добыче нефти из моря.

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

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

Дополнение «Artist Pack»

У Rust одна из самых разнообразных игровых сообществ среди всех популярных игр — от хардкорных PVP-игроков до дружелюбных и не очень дружелюбных ролевиков. Чтобы отразить это, мы достали наши лучшие цифровые кисти и создали набор DLC «Художник» — коллекцию крутых и оригинальных предметов, призванных помочь вам выразить себя, независимо от того, хотите ли вы нарисовать очаровательный портрет или разрисовать базу соседа. 



Пейнтбольный пистолет и комбинезон

Превратите тактический штурм в искусство с помощью пейнтбольного пистолета и комбинезона. Благодаря уникальному типу боеприпасов зарядите бункер пейнтбольными шариками, выберите цвет своей команды и устройте представление. Доступно в 5 цветах для нескольких команд.

Пейнтбольные шарики наносят разный урон в зависимости от того, надеты ли комбинезоны как на пораженного игрока, так и на игрока, нанесшего удар. Для регулировки этих параметров по желанию администраторов предусмотрены отдельные серверные константы: «paintballstandarddamage» и «paintballoverallsdamage».

Конечно, вы также можете использовать пейнтбольный пистолет, чтобы «пометить» всё, что захотите, а не только других игроков! Кроме того, пейнтбольные комбинезоны обладают уникальной особенностью: капюшон динамически поднимается или опускается в зависимости от выбранного вами головного убора.


Окрашиваемая реактивная мишень

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

Богато украшенные рамки

Придайте своей базе нотку изысканности с помощью этих декоративных рамок. Нарисуйте на них что-нибудь или добавьте фотографию, а когда будете довольны своим шедевром, придумайте для рамки уникальное описание. Доступны в 5 размерах — от малого до экстра-экстра-крупного.


Светящиеся рамки


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


Рамки с жалюзи


Раскройте свои дизайны с помощью рамок с жалюзи. Они доступны в 5 размерах, и вы можете поднимать и опускать жалюзи как вручную, так и с помощью IO, что открывает безграничные возможности — от конкурса в стиле телевизионного шоу RP до грандиозного раскрытия вашей базы-ловушки. 

Холсты без рамок

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

Портативный мольберт


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

Окно, на которое можно рисовать


Хотите ли вы создать витраж, аквариум, витрину магазина или приманку в стиле «Один дома» — это окно, которое можно раскрасить, пригодится вам! Это развертываемое устройство представляет собой обложку для окна из усиленного стекла.


Спреи «Награда в виде розетки»


И, наконец, в наборе DLC «Художник» вы найдёте 4 уникальных спрея, которые можно использовать с инструментом «Аэрозольная краска». В набор входят спреи за 1-е, 2-е, 3-е места и… последнее место. Используйте их по своему усмотрению.


Новый объект для кастомизации в мастерской: SKS

В этом месяце мы представляем следующий объект для нанесения скинов в мастерской: SKS

SKS был одним из самых востребованных оружий в сообществе создателей скинов, и мы рады удовлетворить этот запрос! Поскольку это одно из наших новейших оружий, нам не терпится увидеть, как сообщество будет работать с его обновленным внешним видом.

Чтобы создать собственный скин для SKS, перейдите в игровую мастерскую и найдите предмет «SKS». Оттуда вы сможете скачать файл модели и добавить свои собственные материалы.

Производительность серверов

Если вы следили за разработкой этого обновления, то, вероятно, знаете, что в прошлом году нам пришлось отложить его из-за некоторых серьезных проблем с производительностью серверов. С тех пор мы уделяли огромное внимание тому, чтобы производительность серверов максимально приблизилась к уровню, который был до обновления «Naval». Хотя многие проблемы были связаны с новым контентом, мы не остановились на этом и значительно улучшили старые узкие места, влияющие на производительность.

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

Производительность приготовления пищи/печи

Мы заметили значительные задержки в обработке кадров, связанные с процессом работы печей — это касается любых костров, печей, грилей и т. д. При более тщательном анализе выяснилось, что здесь было несколько проблем. Процесс приготовления запускается каждые 0,5 с без рандомизации, поэтому, если одновременно работает много печей, их запросы могут накапливаться и вызывать значительные скачки задержки. В искусственном тестовом сценарии, в котором синхронно работали 500 печей, на обработку всех печей уходило 18 мс.

Теперь «Oven» использует максимальный бюджет в 0,25 мс на кадр, чтобы сгладить нагрузку при работе в большом масштабе. Это могло бы просто замедлить работу системы, поэтому мы также провели некоторые оптимизации, чтобы ускорить работу каждого «Oven». При создании предмета на выходе мы раньше создавали новый предмет (например, 1 металлический осколок) и пытались добавить его в стек выхода (что обычно приводило к добавлению +1 к существующему стеку, а затем к удалению вновь созданного предмета). Гораздо быстрее проверить, есть ли уже предмет в выходе, и просто увеличить его количество, минуя процесс создания нового предмета (мы уже некоторое время используем этот приём в промышленной системе). Каждая печь также просматривала все свои предметы в поисках топлива при каждом тике, но теперь эти данные кэшируются. Наконец, печь помечала свой инвентарь как «измененный» каждый раз при обновлении процесса плавки (для обновления анимированного индикатора прогресса на значке предмета), а теперь он помечается как «измененный» только при превышении порогового значения (5 %, 10 % и т. д.), что значительно сокращает накладные расходы, связанные с отправкой обновлённого инвентаря.

Благодаря этим изменениям время прохождения теста с 500 печами, плавящими металлическую руду, сократилось до максимум 0,25 мс, часто бывает и меньше, при этом игроки не замечают никаких изменений.

Производительность промышленной системы

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

Основной прирост производительности здесь был связан с сокращением количества итераций по контейнерам с предметами и другим массивам. При таких масштабах даже простое извлечение предмета из контейнера может занимать много времени, так как порядок предметов в памяти может не совпадать с порядком в контейнере, и нам, возможно, придётся пройти по всему контейнеру, чтобы найти предмет в конкретном слоте. Умножьте это на количество слотов в каждом входе и оценку каждого слота на каждом выходе — и затраты быстро накапливаются. Реализация быстрой таблицы поиска, к которой мы могли обращаться во время выполнения «Промышленного» процесса, дала огромный выигрыш: в некоторых случаях нам удалось избежать более 20 000 переборов.

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

Система отношений

Система RelationshipManager управляет системой «Контакты» — она сохраняет изображения встреченных игроков и отслеживает ваши взаимоотношения. Её функционал относительно ограничен, но на серверах с большим количеством игроков она работала довольно долго. 

Она просматривала всех игроков на сервере, находила тех, кто находится в радиусе действия, проверяла, видны ли они (с помощью физической проверки), и при необходимости создавала новую связь. Кроме того, она просматривала все существующие отношения каждого игрока, вычисляла, сколько игроков отметили данного игрока как «негативного», и по умолчанию помечала их как враждебных (то есть их именные бирки становились красными). Это происходило каждую секунду без какой-либо защиты от одновременного запуска этого процесса многими игроками в одном кадре, что могло приводить к периодическим значительным задержкам в кадрах — до 0,75 мс на загруженных серверах.

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

Размеры коллайдеров игроков

Мы поддерживаем изменение размера коллайдера игрока в определённых сценариях — когда игрок сбит с ног, спит, находится на транспортном средстве и т. д. Раньше это реализовывалось путём перебора всех игроков на сервере в каждом кадре и обновления размера по мере необходимости. На сервере со средней загрузкой это занимало 0,25 мс, хотя в большинстве случаев обновлять размер коллайдера не требовалось.

Я усовершенствовал этот процесс, внедрив очередь с ограниченным временем обработки, так что теперь в каждом кадре обновляются данные только тех игроков, на которых уходит не более 0,05 мс. Поскольку размер коллайдера игрока весьма важен, я добавил возможность ручной настройки размера при смене состояния игрока (например, когда он засыпает), так что размер по-прежнему обновляется немедленно, а не с задержкой в несколько кадров. 

Объёмы-родители

В Rust у нас есть система под названием «объёмы-родители» — как следует из названия, эти объёмы определяют, находится ли игрок или другой объект поблизости и должен ли он быть привязан к другому объекту. Поскольку существует множество крайних случаев, мы также проводим дополнительные проверки (например, физические запросы), чтобы избежать проблем.

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

А вот сколько это занимает времени — 3,5 мс, что довольно много для чего-то, что не используется активно:

Я потратил время на переработку этой логики, которая запускается, если TriggerParent.TickMode установлен в 1 (что является значением по умолчанию). Теперь она:

  • Использует собственную очередь обработки вместо вызовов Invoke, что сокращает задержки, если физический мир меняется между отдельными вызовами
  • Использована пакетная обработка и задания Burst для перекрытия работы между потоками там, где это возможно
  • Пропускает работу, если объем и его содержимое не переместились/не изменились

В результате вышеописанный сценарий теперь занимает:

  • 1,4 мс (-61 %), если все лодки движутся
  • 0,25 мс (-93 %), если все лодки неподвижны

Всплески при процедурном появлении объектов

Просматривая наши данные телеметрии производительности, я заметил, что мы сталкиваемся со странными, частыми и значительными всплесками задержки примерно каждую минуту:

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

Я написал инструмент, который моделирует пополнение популяции (spawn.dump_map <popname> [count=100]), визуализирует, как работает выборка и почему выборки отбраковываются. Различные причины отбраковки обозначены цветом, причём только «зелёный» цвет означает успех. Вот визуализация до исправлений — 25 000 (максимальный лимит) попыток породить 800 куч мусора:

Оказалось, что у нас было несколько ошибок, которые не только препятствовали появлению новых объектов, но и продолжали генерировать выборки даже в тех случаях, когда появлять нечего. Исправив их и запустив инструмент заново, мы получили 3019 попыток появления 800 куч мусора (нужно увеличить масштаб, чтобы разглядеть пиксели):

Это также положительно сказалось на наших данных телеметрии по максимальному времени обработки кадра — пики задержки теперь встречаются гораздо реже:

Производительность автотурелей

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

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

На приведённом ниже графике показана разница во времени выполнения метода SendAimDir(), который использовался для отправки этих значений по сети. Патч был запущен в 22:00 на наших тестовых серверах (вы можете увидеть резкое падение после внедрения). Это изменение также затрагивает баллисту и новую пушку, снижая сетевую нагрузку для обоих устройств.


Эти обновления углов также выполнялись для каждой турели в основном потоке без значительной балансировки нагрузки или ограничения пропускной способности. 

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

НОВОЕ — tick_update_ms (по умолчанию 1) — максимальное количество миллисекунд, которое можно потратить на обновление угла наведения турели и общие обновления за один кадр

НОВОЕ — ammo_update_ms (по умолчанию 0,1) — максимальное количество миллисекунд, которое можно потратить на каждый кадр на проверку боеприпасов турели

scan_budget_ms (по умолчанию 0,5) — количество миллисекунд, которое можно потратить на сбор данных об углах наклона турелей за один кадр

 

Производительность системы плавучести

В рамках подготовки к обновлению «Морские сражения» нам потребовался способ, позволяющий нашим водным системам поддерживать большое количество плавающих объектов в глубоководной среде. Сюда входят не только новые игровые лодки, но и существующие плавучие объекты, такие как трупы или добыча.

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


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


В результате это в 4 раза быстрее в сценарии с 200 лодками (каждая из которых имеет несколько точек плавучести) и лучше масштабируется по сравнению с прежним вариантом при добавлении новых объектов. 

Пользовательский Unity / PhysX

Физика долгое время была узким местом в производительности сервера Rust. Помимо сокращения количества коллайдеров в мире, у нас не было возможности значительно снизить эту нагрузку. Однако в прошлом году мы получили возможность вносить собственные изменения в нашу версию движка Unity и развертывать обновления игры с его использованием.

Физический такт можно разбить на множество различных этапов. Самым большим «узким местом» для Rust является так называемая «широкая фаза» (broadphase). Это часть физического такта, в которой быстро выявляются пары коллайдеров, которые потенциально могут вступать в столкновение, после чего на более позднем этапе выполняются более ресурсоемкие вычисления для определения точной информации о контакте. Уже один только размер карты в Rust и плотность коллайдеров на крупных базах делают эту операцию очень ресурсоемкой.

Мы внесли целенаправленные изменения в физический движок (PhysX), что значительно ускорило эту часть физического тика. Параллелизация «broadphase» стала самым значимым изменением, которое мы смогли внести: каждый регион был разбит на отдельную задачу, которая планируется во всех доступных рабочих потоках, а затем результаты снова объединяются в главном потоке.

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

Чтобы убедиться в безопасности этих изменений, мы выпустили обновление сервера ещё до обновления морского контента, в котором был реализован только переход на новую версию Unity/PhysX. Естественно, всё это повышение производительности привело к увеличению ограничений для игроков, и цикл начался заново.

В будущем я планирую внести дальнейшие улучшения в PhysX и Unity, так что ситуация будет только улучшаться.

Производительность игрока на транспортном средстве — лодки

Когда игрок садился на лодку, мы постоянно в каждом кадре устанавливали его положение в точку посадки, вместо того чтобы просто привязать игрока к объекту. Привязка автоматически перемещала бы игрока в точку посадки относительно дешево или бесплатно, тогда как наш метод установки положения довольно ресурсоемкий. 

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

Эта нагрузка также увеличивалась из-за ИИ, сидящего на транспортных средствах, количество которого в этом патче значительно возросло. К счастью, эти улучшения также устраняют увеличение нагрузки со стороны ИИ.

Ранее, на тестовом сервере с небольшим количеством игроков (около 20~), на перемещение игроков уходило примерно 0,6 мс на каждый кадр:

С сотнями ИИ мы теперь достигаем 0,02 мс на родительском методе MountedPlayerSync, а сам MountedPlayerSync даже не вызывается:

Производительность вагона-кабины

В прошлом месяце я заметил необычное падение производительности при беге по «Аванпосту»; оказалось, что статичный вагон-кабус использовал чрезмерное количество канв, теперь это исправлено.

Это также сказывалось на игроках, находящихся вблизи вагона вагона-кабуза в открытой местности.

Производительность дробовых ловушек и огневых турелей

Мы заметили необычные всплески нагрузки, вызванные огневыми турелями и ловушками с дробовиками. Это происходило каждые несколько секунд на крупных базах без TC. Довольно редко, но тем не менее исправлено.

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

Server Profiler — режим «Immediate»

За пару дней до введения внутреннего карантина я внедрил экспериментальное улучшение в ServerProfiler — возможность захватывать определённые участки кода. Это должно быть полезно при поиске пиков задержки или измерении редко выполняемого кода. Вот несколько примеров использования:

// записываем Run() и все внутренние вызовы, затем экспортируем снимок
using(ServerProfiler.RecordScope("IndustrialQueue",
RecordIndustrialQueueServerVar))
{
industrialQueue.Run();
}
//
ИЛИ// продолжаем запись и экспортируем только в том случае, если время выполнения превышает 5 мс
, используя(ServerProfiler.RecordScopeIfSlow("IndustrialQueue",
TimeSpan.FromMilliseconds(5), RecordIndustrialQueueServerVar))
{
industrialQueue.Run();
}

В обоих случаях будет создан файл IndustrialQueue.json.gz, который можно найти локально в папке server/<ident>/profiler/. Чтобы не перегружать систему снимками и не создавать лишнюю нагрузку (запись всё же снижает производительность, а экспорт выполняется асинхронно):

  • Настоятельно рекомендуется использовать флаг, указывающий, активны ли области (в примере — RecordIndustrialQueueServerVar)
  • ServerProfiler имеет внутренний 30-минутный период ожидания после экспорта, в течение которого области действия неактивны. Настраивается с помощью profile.ExportIntervalS; интервал можно сбросить с помощью profile.ResetExportInterval, если вы не хотите дожидаться его окончания
  • Всю эту функцию можно отключить с помощью profile.ImmediateModeEnabled (по умолчанию включено)
  • Она предназначена для кода, выполняющегося за 0,05 мс или дольше, поэтому не используйте её для профилирования «несложных» операций (настройка профилировщика и установка профилирующих хуков требуют времени)

Twitch Drops — самодельное 4

Twitch Drops вернулись!

С 5 по 15 февраля!

Подключайтесь, чтобы посмотреть невероятные стримы от некоторых из наших любимых восходящих авторов в сообществе Rust!

Не забудьте синхронизировать аккаунты и получить свои Drops после просмотра стримов этих фантастических авторов на Twitch.

Скидка 50% на Rust 

Эй, матросы!

В честь долгожданного выхода морского обновления игра Rust теперь доступна за полцены в течение ограниченного времени! Приобретите её в Steam и подарите другу, чтобы принять на борт новых членов экипажа!


Особенности

  • Область для исследования в глубоком море
  • Плавучие города
  • Тропические острова
  • Корабли-призраки
  • Модульные лодки
  • Новая нефтяная платформа ИИ ученых
  • Новые миссии на морскую тематику
  • ИИ лодки с учёным
  • Катер PT
  • Обновленная графика надувных катеров
  • Модель вида «Планировщик»
  • Экспериментальный серверный профилировщик API мгновенного захвата
  • Новые конфигурационные переменные сервера «paintballstandarddamage» и «paintballoverallsdamage» для настройки величины урона в режиме «Пейнтбол»

Улучшения

  • Теперь дерево технологий всегда открывается в крайнем правом положении
  • Улучшена подсказка, появляющаяся, когда предмет потребления отключен из-за того, что он установлен
  • Команда «deleteentitiesbyshortname» теперь работает корректно
  • Зажигательные ракеты теперь помещаются в боевые вертолёты при использовании команды «fixcars»
  • Ориентационные маркеры оранжевого цвета (спальные мешки) стали менее яркими
  • Повторный клик по значку автомата на карте теперь закрывает его меню
  • Избранное в браузере серверов теперь основано на записи DNS
  • Команде `puzzlereset` теперь можно передавать радиус
  • Интерфейс отображения информации о здоровье теперь появляется на 1 секунду после нанесения урона объектам
  • Добавлены индикаторы боеприпасов на оружии, заряженном нестандартными патронами
  • Добавлена консольная команда «teleport2nearest» для телепортации к ближайшему объекту-цели
  • В миссиях теперь могут быть дополнительные задачи, за выполнение которых даются дополнительные бонусные награды
  • Теперь в миссиях можно контекстно скрывать и отображать маркеры на карте и компасе для текущих целей
  • Теперь в миссиях на карте и компасе может одновременно отображаться более одного маркера цели
  • Различные NPC-дающие миссии теперь будут отображать значки миссий рядом с вариантами диалога, которые позволяют перейти к предварительному просмотру миссии
  • НПЦ-датели миссий теперь могут вести диалог, когда вы подходите к ним, чтобы выполнить миссии. В настоящее время это настроено только для новых морских миссий
  • Клиент больше не выполняет никаких операций по генерации очков миссий
  • Улучшена производительность сервера в системе отношений (контакты)
  • Улучшена производительность сервера системы промышленности
  • Улучшена производительность сервера системы коллайдеров игроков
  • Улучшена производительность сервера системы приготовления пищи (печи, костры, барбекю и т. д.)
  • Повышена производительность сервера при обработке инвентаря
  • Повышение производительности сервера при обработке TriggerVolume
  • Повышение производительности сервера при процедурном распределении объектов (система заселения)
  • При просмотре в дереве технологий для щитов отображается панель с информацией
  • Нажатие клавиши Escape теперь закрывает интерфейс рисования
  • Передвижной торговец больше не будет пытаться появляться на слишком маленьких картах
  • Меню «Быстрое создание» теперь работает быстрее и отображает скины
  • Улучшена согласованность работы команд «authradius», «authcount», «ent auth» и подобных
  • «Ковёр из шкуры медведя» переименован в «Шкура медведя — ковёр»
  • Сообщение в чате, появляющееся при провале миссий, теперь локализовано и содержит причину провала

Исправлено

  • Исправлена проблема, приводившая к появлению «призрачных» предметов, тел и игроков на грузовом корабле
  • Исправлены пробелы в различных памятниках при низких настройках качества
  • Исправлено: линии электропередач на дальних уровнях детализации (LOD) не скрывали игроков, когда должны были
  • Улучшено перемещение по лестницам в экскаваторе и на водоочистной станции
  • Исправлена слишком густая мгла в ответвлении канализации и на стартовой площадке
  • Исправлены некоторые отверстия в рельефе памятников, позволявшие заглянуть внутрь
  • Исправлена ситуация, при которой падающее оружие становилось недоступным в нескольких местах на большой нефтяной платформе
  • Исправлена несоответствующая интенсивность ветра в заснеженных и тундровых зарослях
  • Исправлен случай, при котором одновременное использование DLSS и объемных облаков приводило к искажению графики
  • Исправлена ошибка, из-за которой именные таблички были видны сквозь стены, если между ними находились два слоя стекла
  • Исправлено отсутствие всплывающего окна в магазине при добавлении обоев в корзину
  • Исправлена ошибка сервера при отключении зрителя
  • Исправлена невозможность переключения на вид от третьего лица во время наблюдения
  • Исправлена ошибка, из-за которой грузовой корабль вызывал появление глобального сетевого трафика у игроков
  • Исправлено отсутствие отображения сообщений чата в консоли сервера
  • Исправлена ситуация, при которой дроны могли проникать сквозь пол
  • Исправлена ошибка, приводящая к сбою игры при попытке наблюдать за собственным персонажем
  • Исправлена щель в некоторых скалах в «Военных туннелях»
  • Исправлены некоторые неточные коллайдеры на цепях в верхней части грузового корабля
  • Исправлена ошибка, из-за которой конфетти-пушка не отображала частицы
  • Исправлена ошибка интерфейса при использовании браузера серверов
  • Исправлены некорректные текстуры на M15 в режиме от третьего лица
  • Исправлена ситуация, при которой датчик HBHF мог устанавливаться внутри стен
  • Команда «connecthidden» больше не выводится в журнал игрока
  • Исправлено: адаптеры хранения могли сортировать данные, даже если не были подключены к источнику питания
  • Исправлена ошибка, из-за которой адаптеры хранения неправильно рассчитывали пропускную способность при подключении через трубы
  • Исправлено: предметы, брошенные рядом с бочками «Бездна», влияли на растительность
  • Исправлена ошибка, из-за которой солнечный свет иногда проникал в железнодорожные туннели
  • Улучшена лестница на станции «Водоочистка», которая останавливала игроков наверху
  • Исправлена проблема с «z-fighting» крышек люков на паромном терминале
  • Исправлено некорректное отображение теней на некоторых утесах
  • Исправлено преждевременное удаление некоторых баррикад на железнодорожной станции
  • Исправлена ошибка, из-за которой на каркасе глинобитной стены отображались наклейки с эффектом удара по дереву
  • Исправлено неправильное расположение некоторых труб кондиционирования воздуха в канализационных пещерах
  • Исправлена проблема, из-за которой при низком качестве графики не было видно капитанской палубы на грузовом судне
  • Исправлена ошибка, из-за которой мусорный бак на «Малой нефтяной платформе» проникал сквозь землю
  • Исправлена некорректная видимость через некоторые окна на аэродроме
  • Исправлена ошибка, из-за которой прожектор на большом сарае светился некорректно
  • Исправлено: неработающие холодильники в арктическом биоме не охлаждали еду
  • Исправлено: порча продуктов в рюкзаках и удочках, брошенных в арктическом биоме
  • Исправлена возможность размещения ковриков на некоторых подвижных объектах (грузовом судне, экскаваторе)
  • Исправлена проблема, из-за которой настройки болотной среды делали интерьеры баз слишком тёмными
  • Исправлена ошибка, из-за которой было невозможно завершить квест «Точка появления аванпоста» в случае потери документов
  • Исправлена редкая ошибка, вызванная движением грузового корабля
  • Исправлена ошибка TMPro.TMP_InputField.GenerateCaret
  • Исправлено слишком тёмное освещение в базах, расположенных на болотах
  • Исправлено некорректное освещение различных вращающихся источников света, например, на сбросах грузов
  • Исправлена ошибка, из-за которой ящик с вертолётом «Чинук» падал на линию электропередачи на электростанции
  • Исправлена возможность проникновения внутрь стены рядом с мостами гавани
  • Исправлена ошибка, из-за которой команда `spawn_all_deploybles` не генерировала устаревшее укрытие
  • Исправлена возможность игроков сбрасывать добычу внутрь панелей управления в «Ядерном ракетном бункере»
  • Исправлены ошибки с тенями на прибрежных утесах
  • Исправлены проблемы с прорисовкой некоторых деревьев в умеренном, тундровом и арктическом климатических поясах
  • Различные исправления в диалоговых деревьях разных NPC, связанные с последовательностью реплик и английскими диалоговыми строками
  • Исправлено отображение номеров вариантов диалога NPC с неверными цифрами
  • Теперь можно разговаривать с NPC при включенном режиме noclip
  • Панель диалога NPC больше не выглядит кликабельной, если нажатие на неё ничего не делает
  • Теперь различные типы целей миссий должны сбрасывать свой статус выполнения, если критерии выполнения больше не соблюдаются, пока миссия остаётся активной
  • При разговоре с NPC-дающим задание для завершения миссии диалог больше не будет автоматически запускаться при нажатии кнопки «Завершить миссию»
  • Незначительные оптимизации интерфейса списка задач миссий
  • Оптимизирована генерация сериализованных сетевых данных для миссий — теперь они должны генерироваться реже
  • Оптимизирована работа с памятью на клиенте и сервере при обработке данных о прогрессе игрока в миссиях
  • Исправлена проблема, из-за которой клиент мог видеть миссии как доступные, когда они таковыми не были
  • Радиальное контекстное меню «Boombox» больше не отображает кассету, если в него не вставлена подходящая кассета.
  • Исправлена проблема, из-за которой большинство частиц на основе мешей были невидимы
  • Изменено управление потоком текстур: теперь оно динамически регулируется в зависимости от необходимого объёма памяти, чтобы предотвратить появление текстур с низким разрешением
  • Исправлено некорректное отображение карты нормалей и окружающей окклюзии на RHIB
  • Исправлена задержка при потоковой передаче текстур при размещении объектов
  • Исправлено: игроки-зрители оставляли «призрак» в поле зрения других игроков
  • Исправлены несоответствия в группах окклюзии на сервере, которые могли приводить к невидимости игроков
  • Исправлен некорректный расчет стандартного отклонения в аналитике производительности, приводивший к появлению значений NaN
  • Исправлено: дочерние объекты движущихся объектов становились невидимыми
  • Оптимизирована проверка того, в каком объёме окружения находится тот или иной объект
  • Оптимизирована работа с памятью при поиске деталей одежды, надетых в данный момент
  • Обеспечена совместимость различных головных уборов с другими предметами одежды, которые настроены на ношение под головными уборами
  • Оптимизирована работа с памятью при запуске снарядов клиентом
  • Оптимизирована работа с памятью при открытии радиального меню смены боеприпасов
  • Исправлена утечка объектов хранения подземных тележек при перезапуске сервера
  • Теперь для локального игрока всегда должны появляться деколи от удара снаряда, независимо от расстояния до места попадания, если именно локальный игрок произвёл выстрел
  • Исправлена ошибка, из-за которой миникоптеры нельзя было ремонтировать, если переднее колесо не касалось земли
  • Исправлены всплески задержек на сервере, вызванные проверками появления и исчезновения куч мусора
  • Исправлено несколько уязвимостей, связанных с читами
  • Исправлено некорректное обновление одежды игрока при использовании команды «clearinventory»
  • Исправлена ошибка, из-за которой игровой автомат в аванпосте висел в воздухе
  • Исправлена проблема с парящей кучей мусора в гигантском экскаваторе
  • Исправлена редкая ошибка, из-за которой головы моделей игроков визуально застревали в положении, смотрящем вниз
  • Исправлены ложные срабатывания системы защиты от «флайхака» при прыжке на лестницу лунного колодца на нефтяной платформе
  • Исправлено некорректное появление добычи из ракетного бункера при перезапуске сервера
  • Исправлена ошибка, из-за которой радиация при сбросе головоломки распространялась внутри железнодорожных туннелей у некоторых памятников
  • Исправлено: животные джунглей не учитывались в статистике «убитых животных» на экране смерти
  • Исправлена некорректная работа сортировки по «последней игре» в браузере серверов
  • Исправлено несколько проблем, связанных со скинами зданий, и улучшена согласованность
  • Исправлен неоднозначный путь в технологическом дереве 2-го уровня
  • Исправлена невозможность сброса скина гранатомета обратно к знакомому
  • Исправлено появление ошибок коллизий при использовании некоторых рождественских префабов для модификаций
  • Исправлена ошибка, из-за которой изображения пользовательских предметов случайно появлялись на вновь созданных предметах
  • Исправлена ошибка, из-за которой при копировании и вставке иногда случайно пропускались объекты
  • Исправлена возможность бесконечного штабелирования половин полок
  • Исправлена возможность проникновения дронов сквозь потолки
  • Исправлено несколько мелких утечек памяти как на клиенте, так и на сервере
  • Исправлена ошибка, из-за которой награды за миссии могли превышать размер стека
  • Исправлено: большое количество пчелиных гранат значительно снижало производительность сервера
  • Исправлена ошибка, при которой персонаж застревал на лестнице из куч мусора с водой
  • Исправлена невозможность размещать коврики на окнах
  • Исправлена проблема, из-за которой игроки на несколько секунд «зависали» после возрождения в кемперах

Удалено

  • Отключено появление буксиров — они служили тестовой площадкой, которая привела к появлению лодок, построенных игроками. Рассмотрим возможность их повторного введения в будущем
  • Удалена настройка «Shadow Mask» из меню «Graphics Settings», так как она предназначена только для запечённого освещения, которое в Rust не используется