GameDev: разработка игр
7.64K subscribers
937 photos
203 videos
1 file
1.35K links
Всё про геймдев для девелоперов, художников, левел- и геймдизайнеров, сценаристов

Разместить рекламу: @tproger_sales_bot

Другие каналы: @tproger_channels

Другие наши проекты: https://tprg.ru/media
Download Telegram
Как Godot исправил просадки FPS от мышей на 8 кГц

Мышь с высокой частотой опроса может отправлять тысячи событий в секунду. В Windows поток сообщений способен перегрузить обработку ввода: до исправления быстрое движение мышью на 8 кГц почти останавливало тестовую сцену Godot.

Исправление вошло в Godot 4.7.2. События raw input читаются пакетами, а обычные сообщения движения мыши обрабатываются отдельно, не чаще одного раза за кадр. Клавиши, кнопки и колесо продолжают работать по прежней схеме.

Это полезный повод проверить обработчики _input() и _unhandled_input() в своём проекте. Дорогая логика на каждом движении мыши всё ещё может съедать время кадра, особенно при отключённом накоплении ввода.

Разбор команды Godot
❤2
Как выбрать способ оптимизации шейдера в UE5

Граф Material Editor уже компилируется в HLSL. При этом Custom Expression может ограничить свёртку констант и дать больше инструкций, чем те же операции, собранные стандартными узлами.

Начать стоит с замеров: stat unit помогает найти ограничивающий этап, а stat gpu и ProfileGPU — дорогие проходы. На стоимость материала влияют площадь экрана, перекрытие прозрачных объектов и обращения к текстурам.

Для обычного материала подходят узлы и Material Functions. Небольшую нестандартную формулу можно вынести в Custom Expression, а отдельный вычислительный проход — в Global Shader с RDG.

В разборе для UE5 показано, как выбирать уровень реализации и сравнивать результат на целевой платформе.
Как убрать рывки движения других игроков

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

Интерполяция использует два известных серверных состояния и плавно меняет положение между ними. Для этого клиент показывает других игроков с небольшой задержкой: в примере Габриэля Гамбетты она составляет 100 мс.

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

Разбор интерполяции с наглядными примерами помогает понять эту схему без привязки к конкретному движку.
❤1
Как Godot ускорил анимацию Polygon2D

В тестовом проекте вершины Polygon2D анимировались через AnimationPlayer. Профилировщик показал, что движок каждый кадр пересоздавал внутренний меш: удалял старые массивы вершин, создавал новые и загружал данные заново.

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

В демонстрационной сцене на Ryzen 5 9600X время кадра сократилось примерно с 35 до 13 мс. Результат относится к этому сценарию анимации.

Разбор с профилями до и после показывает весь ход поиска: от жалобы на медленную анимацию до конкретных затрат на создание и освобождение мешей.
❤1
Почему окрестности 5×5 недостаточно для ячейки Вороного

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

Борис из BorisTheBrave показал, что привычная область 5×5 может дать неверную границу: точка из клетки со смещением (3, 1) тоже способна на неё повлиять.

Автор определил набор из 36 соседних клеток, каждая из которых может оказаться значимой, и приложил формальное доказательство в Lean.

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

Контрпример и доказательство полезны для проверки генератора регионов или процедурной геометрии.
❤1
Как ошибки QuadriFlow срывали ретопологию моделей SketchUp

Автор skpforge, инструмента подготовки ассетов для Unreal Engine 5, перенёс основной маршрут QuadriFlow на Rust. На моделях SketchUp обнаружились две ошибки исходной реализации: неверные связи полурёбер зацикливали обработку, а недостижимый код оставлял проблемные вершины неразделёнными.

После исправлений автор занялся максимальным потоком, который отнимал значительную часть времени ретопологии. На его данных алгоритм Бойкова — Колмогорова оказался удачнее Dinic.

На одной тяжёлой модели время обработки в Rust-порте сократилось с 441 до 137 секунд после замены решателя. Это измерение конкретного случая; сравнения с upstream в статье дают разные результаты в разных тестах.

Разбор ошибок, замеров и кода порта
❤1
Как Unity загружает ассеты по отдельности

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

В Unity 6.6 появились content directories. Меши, текстуры и другие артефакты можно загружать и освобождать независимо. Манифест хранит зависимости, а адресация по содержимому помогает устранять дубликаты.

Разбор устройства content directories показывает сборку, асинхронную загрузку и новый тип ссылок Loadable<T>. В текущей версии технология работает с контентом, поставляемым вместе с Player. Полноценная доставка отдельных ассетов по сети заявлена для поколения Unity 7.
Как разделить предметы и слоты инвентаря в Godot

Двадцать стрел в рюкзаке имеют одно описание и количество 20. Хранить название, иконку и свойства заново в каждом слоте нет необходимости.

В разборе инвентаря на Resource ItemData содержит общие данные предмета, а ItemSlot — ссылку на него и количество. Для оружия, щитов и расходников используются отдельные типы ресурсов; конкретные предметы настраиваются в .tres-файлах.

Логика инвентаря добавляет предметы в стеки, ищет подходящие и пустые слоты, уменьшает количество при удалении. Такое разделение позволяет менять описание предмета отдельно от содержимого рюкзака. Код экипировки — следующий шаг: наличие WeaponItemData само по себе его не реализует.
❤1
Как собрать физическую дверь или мост в PlayCanvas

Дверь должна вращаться вокруг петли, а доски подвесного моста — проседать под нагрузкой. Для такого поведения подходят соединения rigid body: они ограничивают движение тел относительно друг друга.

В PlayCanvas Editor 2.32 Joint-компонент можно полностью настроить в инспекторе. Доступны Fixed, Ball, Hinge, Slider и 6DoF. У шарнира есть пределы вращения и мотор, у соединений — порог импульса для разрушения.

Разбор Joint-компонента показывает настройки и примеры применения. Для работы нужны Ammo и rigidbody у связанных объектов. Если второе тело не указать, соединение закрепит первое в пространстве мира. Пружины и ограничения по отдельным осям настраиваются через 6DoF.
❤1
Как найти память, которую удерживает выгруженная сцена

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

В предварительной версии Memory Profiler 1.2.0-pre.1 появилась таблица Roots & Impact. Она показывает, какие корни удерживают объекты и сколько памяти связано с этими цепочками ссылок. Можно отдельно посмотреть статики, сцены и AssetBundle.

Разбор нового представления объясняет поиск Leaked Managed Shells и фильтрацию утечек по размеру. Место создания объекта не всегда объясняет, почему он до сих пор жив: здесь полезнее проследить удерживающие ссылки. Пакет пока имеет статус pre-release.
❤1
Как связать рычаг и мост из разных сцен в Godot

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

В разборе системы переключателей связь проходит через SwitchBus, добавленный в Autoload. SwitchTrigger меняет значение переключателя, а SwitchMonitor следит за ним. Оба используют один идентификатор.

Рычаг получает область взаимодействия и меняет состояние триггера. Мост реагирует через монитор и AnimationPlayer. Объекты можно разместить в разных сценах: посредник хранит состояние между переходами. Для сохранения после закрытия игры понадобится отдельно записывать эти данные на диск.
Что Defold 1.13.2 добавил для интерфейсов и 3D-физики

Цветной текст, встроенные спрайты и анимированные надписи теперь можно делать средствами Defold. В версии 1.13.2 rich text появился у Label-компонентов и текстовых GUI-узлов.

Для 3D-проектов расширился Lua API Bullet: доступны миры, тела, формы и ограничения. Добавились collision meshes для подробной статической геометрии. Редактор также получил HTTP-методы для сборки и запуска проектов.

Разбор релиза перечисляет новые возможности и изменения при обновлении. В существующем проекте стоит проверить собственные HTML-шаблоны, настройки Android R8 и переименованную константу события окна. Полные release notes связаны с анонсом.