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

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

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

Другие наши проекты: https://tprg.ru/media
Download Telegram
Как нейросеть восстанавливает свет от объектов за пределами кадра

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

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

Модель из технического разбора AMD содержит 2,19 млн параметров и без оптимизации, в FP32 PyTorch, обрабатывает кадр 512×512 за 45,56 мс на MI250. Для разработчиков рендеринга это ориентир для экспериментов с входными данными, но пока не готовый способ получить кадровую частоту реального времени.
❤3👎1
Как разделить управление меню и персонажем в Unity Input System

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

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

Архитектура ввода Mega Cat Studios дополняет эту схему центральным менеджером: он переключает карты действий, подписывается на события и обрабатывает смену устройств. Такой фундамент упрощает добавление новых меню, схем управления и локальных игроков без каскада проверок по всему коду.
❤4
Как собрать toon-шейдер для VR в Unity URP

В Shmackle VR базовые Unlit-шейдеры давали плоскую картинку и нестабильные 70 FPS на Quest 2. Автор собрал систему из трёх частей: ступенчатого света, экранных контуров и краевого освещения, которое отделяет силуэт от фона.

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

В проекте автора частота закрепилась на 90 FPS, вызовы отрисовки сократились с 340+ до 180, а варианты шейдера с 12 до 4. Это ориентир, а не гарантия: архитектуру и код прохода контуров стоит проверять профилированием прямо на целевом шлеме.
❤1
Как сделать процедурные уровни разнообразнее, ограничивая случайность

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

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

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

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

В основе врага находится CharacterBody3D. NavigationAgent3D ведёт его к точкам патруля или игроку в обход препятствий, а две области Area3D отдельно замечают цель и определяют дистанцию атаки. Случайная длительность ожидания не даёт группе противников начать движение синхронно.

Разбор 3D-врага в Godot 4 показывает структуру сцены и код состояний. Перед запуском нужно добавить в уровень NavigationRegion3D и запечь навигационную сетку, иначе враг не сдвинется с места.
❤2
Как связать движение и направленные анимации в Godot 4

В 2D-персонаже мало умножить вектор ввода на скорость: после остановки он должен смотреть туда же, куда шёл, а при движении по диагонали выбирать подходящий спрайт. В Godot 4 это можно собрать через CharacterBody2D и AnimationTree без отдельных условий для каждого направления.

GDScript получает направление через Input.get_vector(), задаёт скорость для move_and_slide(), а анимациями управляют два BlendSpace2D внутри машины состояний. Один отвечает за покой, второй за ходьбу. Компоненты вектора округляются до −1, 0 или 1, а позиция смешивания обновляется только при ненулевом вводе. Поэтому после отпускания клавиш сохраняется последнее направление взгляда.

Практический разбор настройки показывает координаты для направленных анимаций и переключение между покоем и ходьбой через travel().
❤1
Как AMD уменьшает мерцание нейросетевого глобального освещения

Одношаговая диффузионная модель восстанавливает непрямой свет по данным о геометрии, материалах и освещении за один проход.

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

Схема метода AMD показывает замену обычного декодера временным. На тестовых сценах подход лучше прежних методов сохранял геометрию и стабильность освещения. Замеров времени кадра и готовой интеграции в Unity, Unreal Engine или Godot пока нет.
❤1
Как озвучить пролетающие машины в Defold без десятков звуков

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

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

Микшер раз в кадр оставляет три источника: сначала видимые, затем ближайшие. В практическом разборе есть функции для высоты тона, громкости и панорамы, схема управления звуками и стартовые параметры, которые можно перенести в другой движок.
❤1
Как масштабировать Unity-проект: модули кода и проверки ассетов

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

В разборе Mega Cat Studios Assembly Definitions группируют C#-код и явно задают зависимости. В Backyard Baseball ввод и игровая логика находятся в разных DLL, поэтому управление можно переписать без риска сломать физику персонажей или ИИ. Небольшие сцены и вложенные префабы снижают риск конфликтов между правками художников и дизайнеров.

AssetPostprocessor автоматически применяет правила импорта, а OnValidate сообщает об отсутствующих ссылках в редакторе до сборки. Для растущего Unity-проекта ориентир простой: после прототипа разделить код на модули, сцены на части и автоматизировать повторяемые проверки ассетов.
Как 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