gram news
GameDev: разработка игр channel avatar

GameDev: разработка игр

@make_game

Всё про геймдев для девелоперов, художников, левел- и геймдизайнеров, сценаристов Разместить рекламу: @tproger_sales_bot Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/media

ProjectsRUProgramming

7,620subscribers

Open the Channel

Latest posts

  • GameDev: разработка игр

    22 Sept, 12:06

    Как пул объектов защищает эффекты от фрагментации памятиОдин взмах посоха порождает сотни частиц. Если каждую создавать и удалять отдельно, свободное место в памяти постепенно дробится: суммарно его хватает, а цельного блока нужного размера уже нет.Пул объектов заранее резервирует один блок и хранит в нём готовые экземпляры. Система частиц берёт свободный, помечает его занятым и возвращает после анимации. Выделять память для каждой искры во время эффекта больше не нужно.Цена предсказуемой работы: ёмкость пула фиксирована. Когда свободных слотов нет, можно пропустить новую частицу, заменить самый тихий из играющих звуков или расширить пул. В разборе Object Pool на Game Programming Patterns показано, как выбрать стратегию переполнения, подобрать размер слотов и не оставить в повторно используемом объекте старые данные.
  • GameDev: разработка игр

    22 Sept, 08:32

    Как сервер засчитывает точный выстрел при сетевой задержкеВ быстрой сетевой игре ваш клиент показывает собственного персонажа в настоящем, а противников в недавнем прошлом. Поэтому при выстреле в голову сервер может получить команду уже после того, как цель сместилась.Компенсация задержки меняет момент проверки. Клиент отправляет точное время выстрела и направление оружия. Сервер по входным данным восстанавливает мир таким, каким его видел стрелок, проверяет попадание в том состоянии и рассылает результат.Цена подхода: игрок может успеть спрятаться за стеной и всё равно получить урон, потому что для стрелка цель ещё была открыта. В разборе Gabriel Gambetta механизм показан на живой демонстрации. При проектировании сетевого шутера закладывайте этот компромисс: точные попадания для стрелка ценой позднего урона для цели.
  • GameDev: разработка игр

    22 Sept, 05:00

    Как Binding of Isaac генерирует подземельяСначала генератор строит план на сетке 9×8, затем назначает особые комнаты и выбирает содержимое обычных. Стартовая комната попадает в очередь. Алгоритм проверяет четыре направления и с шансом 50% добавляет свободного соседа, если тот не создаст петлю.Из тупиков выбираются специальные комнаты: босс получает одну из самых дальних от старта. Для секретной комнаты ищут пустую клетку рядом как минимум с тремя комнатами; после 300 и 600 неудачных попыток требования ослабляют.Разработчику пригодится разделение плана и наполнения: форму уровня можно менять независимо от наборов комнат. В статье «Dungeon Generation in Binding of Isaac» есть демо на JavaScript и разбор того, как Rebirth расширила алгоритм крупными комнатами неправильной формы.
    Image from a post by GameDev: разработка игрImage from a post by GameDev: разработка игр
  • GameDev: разработка игр

    21 Sept, 12:04

    Как генерировать высоты и биомы карты с помощью шумаRed Blob Games показывает генерацию данных карты без отрисовки. Каждой координате присваивают значение шума от 0 до 1 и трактуют его как высоту. Слои с разной частотой смешивают крупные холмы с мелкими деталями, а возведение результата в степень опускает средние высоты и формирует плоские долины.Если выбирать биом только по высоте, леса, пустыни и снег выстраиваются полосами. Второе поле шума задаёт влажность: вместе с высотой она позволяет распределять биомы разнообразнее.В интерактивном разборе Red Blob Games есть C-подобный код, слайдеры и приёмы для островов, хребтов, террас и бесконечных карт. Пороги придётся подбирать под библиотеку шума и способ смешивания слоёв, зато базовый генератор данных карты укладывается менее чем в 50 строк.
    Image from a post by GameDev: разработка игрImage from a post by GameDev: разработка игр
  • GameDev: разработка игр

    21 Sept, 08:32

    Как проектировали Navigation Server для Godot 4.0В 2020 году команда Godot описала новую архитектуру навигации для Godot 4.0. Материал помечен устаревшим: это разбор замысла, а не инструкция по актуальному API.Мир собирался из регионов, которые можно добавлять и перемещать во время работы. NavigationAgent получал цель, возвращал следующую достижимую точку и перестраивал путь после изменения регионов, цели или движущихся препятствий. Навигационную сетку разрешалось пересчитать после добавления геометрии.NavigationObstacle отмечал движущееся тело как препятствие и автоматически определял его размер, скорость и положение. Агент рассчитывал безопасную скорость с учётом препятствий. Статья Godot Engine «Navigation Server for Godot 4.0» показывает механизм на 3D-сцене; тот же подход автор предлагал для 2D.
    Image from a post by GameDev: разработка игрImage from a post by GameDev: разработка игр
  • GameDev: разработка игр

    21 Sept, 05:00

    Зачем игровому циклу собственные часыТипичный цикл событий ждёт клика или клавиши, а игровой цикл продолжает работу без ввода. На каждом проходе он забирает ввод, обновляет ИИ и физику, затем рисует кадр. Поэтому анимация, музыка и противники не замирают, пока игрок ничего не нажимает.Если выполнять цикл с максимальной скоростью, темп симуляции начнёт зависеть от процессора и нагрузки кадра. При 60 кадрах в секунду на проход остаётся около 16 миллисекунд. Пауза после быстрого кадра не даст игре разогнаться, но не поможет, если обновление и отрисовка уже превысили этот бюджет.В главе Game Loop книги Game Programming Patterns разобраны варианты цикла, его согласование с циклом событий платформы и граница между движком и библиотекой. Движок сам владеет циклом и вызывает ваш код, а библиотеку вызывает ваш цикл.
  • GameDev: разработка игр

    20 Sept, 12:11

    Как собрать редактируемую 2D-карту в Unity с Marching SquaresТуториал начинает с сетки ячеек: каждая хранит одно логическое значение, пусто или заполнено. Карту сразу делят на чанки, отдельные фрагменты сетки, чтобы не переделывать структуру, когда мир станет большим.Для редактирования Unity выпускает луч от камеры через позицию курсора. Точка попадания переводится в координаты карты, после чего код находит нужный чанк и меняет состояние ячейки. Размер кисти задаёт трафарет, поэтому за один проход можно заполнить несколько ячеек.Marching Squares превращает сочетания пустых и заполненных ячеек в треугольники. Так из булевой сетки получается меш для редактора 2D-уровней. В туториале Catlike Coding весь путь собран на C# для Unity 4.5.2, поэтому перед переносом в актуальный проект стоит сверить API.
    Image from a post by GameDev: разработка игрImage from a post by GameDev: разработка игр
  • GameDev: разработка игр

    20 Sept, 08:38

    Как пространственное разбиение ускоряет поиск соседей в игровом миреВ стратегии реального времени число попарных проверок растёт как квадрат числа юнитов. Пространственное разбиение хранит объекты с учётом координат, поэтому движок ищет соседей в нужной области, а не на всём поле.Простейший вариант: наложить на поле фиксированную сетку и хранить в каждой ячейке связный список юнитов. Обработчик ближнего боя сравнивает только юнитов внутри ячейки. Когда юнит переходит в другую ячейку, структуру нужно обновить; это расходует процессорное время, а служебные данные занимают память.Оптимизация оправдана при множестве объектов и частых запросах по координатам. При малом числе объектов расходы могут не окупиться. Код на C++ и разбор компромиссов собраны в главе Game Programming Patterns.
  • GameDev: разработка игр

    20 Sept, 05:06

    Как построить кубическую сферу в Unity без скопления вершин у полюсовУ обычной UV-сферы вершины сгущаются у полюсов. В учебнике для Unity 2020.3.23f1 автор предлагает начать с куба: разбить шесть граней на сетки из отдельных квадратов, задать каждой положение, направления координат U и V, нормаль и касательную, а затем притянуть вершины к центру до сферической формы.Индекс задачи определяет грань и столбец квадратов, а повторное использование позиций соседних вершин сокращает часть вычислений. Симметричная развёртка строится вокруг двух противоположных углов куба, выбранных полюсами.В пошаговом разборе Cube Sphere есть код генератора, настройка шести граней и объяснение раскладки сетки.
    Image from a post by GameDev: разработка игрImage from a post by GameDev: разработка игр
  • GameDev: разработка игр

    19 Sept, 19:15

    Зачем игровому движку очередь событийПрямой вызов playSound() блокирует меню, пока аудиодвижок загружает ресурс. Два врага, задетые одной атакой, запускают звук дважды и удваивают громкость. Запросы из потоков приходят вместе, хотя для аудио выделен свой поток.С очередью система оставляет запрос и продолжает работу. Аудиодвижок забирает его позже, сводит звуки, расставляет приоритеты и выполняет работу в своём потоке. Кадр не ждёт загрузки, а аудиосистема выбирает момент обработки.Очередь нужна для разделения отправки и обработки во времени. Если требуется лишь скрыть получателя, Observer или Command проще. Центральная очередь остаётся глобальной, а отправитель не получает немедленного ответа. В главе Game Programming Patterns паттерн разбирают на аудиосистеме и показывают его архитектурную цену.
  • GameDev: разработка игр

    19 Sept, 15:43

    Как разделить код теней в собственном конвейере рендеринга UnityCustom SRP 7.1.0 для Unity 6000.5.8f1 посвящён рефакторингу без изменения рендеринга. Тени точечных источников и прожекторов переносят из общего Shadows в отдельный OtherShadows. Редкий урок по графике, где прежняя картинка означает успех.OtherShadows получает настройки и данные источников света. Структура Handles хранит TextureHandle и BufferHandle для атласа теней и буфера данных; метод Use сообщает графу рендеринга, что проход читает оба ресурса. Shadows остаётся координатором. В новый класс также переносят резервирование теней, построение списков отрисовки и рендеринг.В туториале Catlike Coding показана последовательность правок с кодом. Такое разделение готовит конвейер к будущим улучшениям и не смешивает независимые типы теней в одном классе.
    Image from a post by GameDev: разработка игрImage from a post by GameDev: разработка игр
  • GameDev: разработка игр

    19 Sept, 12:11

    Как численное интегрирование двигает объекты в игровой физикеФизический цикл не вычисляет траекторию сразу. Он делит силу на массу, получает ускорение и малыми шагами обновляет координату и скорость объекта.Цена метода видна на цифрах. Явный метод Эйлера сначала меняет координату по старой скорости, затем скорость по ускорению. При постоянном ускорении и шаге в одну секунду пример даёт 450 метров вместо точных 500 через 10 секунд. При шаге 1/100 секунды получается 499,497 метра.Для пружины с меняющимся ускорением явная схема набирает энергию вместо затухания. Полунеявный метод Эйлера переставляет две строки: сначала обновляет скорость, потом координату, и расчёт пружины становится устойчивым. Разбор Гленна Фидлера на Gaffer On Games содержит код схем, сравнение с точным решением и обзор других интеграторов.
    Image from a post by GameDev: разработка игрImage from a post by GameDev: разработка игр
    81221Open in Telegram
  • GameDev: разработка игр

    18 Sept, 19:15

    Как управлять асинхронной загрузкой ассетов в Unreal EngineAsset Manager позволяет назначить конфигурации монстров и оружия первичными ассетами. По идентификатору он загружает или выгружает связанные модели, текстуры и классы, поэтому весь контент не нужно держать в памяти.Для асинхронной загрузки в C++ создаётся функция обратного вызова. После запроса она получает идентификатор и параметры, например точку появления монстра. Группы Asset Bundles разделяют мягкие ссылки: для меню можно запросить иконку без модели и способностей.Предзагрузка держит ассет в памяти, пока хранится её дескриптор. Если отпустить дескриптор и не вызвать обычную загрузку, Asset Manager выгрузит ассет автоматически. В статье «Asset Manager for Data Assets & Async Loading» есть примеры для C++ и Blueprint.
    Image from a post by GameDev: разработка игрImage from a post by GameDev: разработка игр
  • GameDev: разработка игр

    18 Sept, 15:43

    Как безопасно сериализовать пакеты игрового протокола на C++Пропущенная проверка при чтении сетевого пакета может помочь атакующему уронить сервер. Гленн Фидлер заменяет ручные проверки одним методом Serialize. ReadStream и WriteStream дают одинаковый интерфейс, а шаблоны C++ собирают из него функции чтения и записи.Каждый вызов проверяет диапазон значения и границу буфера; ошибка возвращает false и прекращает разбор без исключений. Для покоящегося физического тела можно отправить один бит вместо линейной и угловой скорости. Число от 0 до 10 с шагом 0,01 превращается в целое от 0 до 1000: меньше битов в пакете при заданной точности.В разборе Gaffer On Games есть реализация потоков, чисел, векторов и кватернионов. Для собственного сетевого протокола это способ не дублировать код и проверки.
    Image from a post by GameDev: разработка игрImage from a post by GameDev: разработка игр
  • GameDev: разработка игр

    17 Sept, 19:19

    Как синхронизировать физику сотен объектов и экономить трафикПри синхронизации состояния симуляция идёт на обеих сторонах, а по сети передают команды игрока и состояние лишь части объектов. Между пакетами объекты движутся по последним координатам и скоростям. В примере с 901 кубом пакет содержит до 64 обновлений.Накопитель приоритета чаще выбирает активные объекты, но счёт остальных растёт каждый кадр. Не поместившееся обновление сохраняет приоритет до следующей отправки.На приёмнике буфер задерживает пакеты на 4–5 кадров при 60 Гц и выдаёт их равномерно. При сжатии всё состояние округляют до сетевой точности на обеих сторонах перед каждым шагом симуляции: иначе расхождение координат вызывает рывки.В статье Gaffer On Games разобраны структура пакета, приоритеты и расчёт под лимит 256 кбит/с.
    Image from a post by GameDev: разработка игрImage from a post by GameDev: разработка игр
  • GameDev: разработка игр

    17 Sept, 15:47

    Как выбрать координаты для гексагональной сеткиВ сетке у гекса шесть соседей, но при хранении по строкам и столбцам смещение зависит от чётности ряда или колонки. Руководство Red Blob Games предлагает представить сетку с тремя осями и ограничением q + r + s = 0.Трёхмерная модель двумерной карты выглядит странно, но упрощает алгоритмы. В кубических координатах можно складывать и вычитать векторы, искать соседей, считать расстояние, поворачивать и отражать точки. Карту можно хранить в осевых координатах q, r, вычисляя третью по формуле s = -q-r.Для прямоугольной карты подходят смещённые координаты или удвоенный шаг по одной оси; для остальных форм рекомендуются осевые либо кубические. Там же разобраны области в радиусе, поле зрения, поиск пути и перевод гексов в экранные пиксели.
    Image from a post by GameDev: разработка игрImage from a post by GameDev: разработка игр
  • GameDev: разработка игр

    17 Sept, 12:15

    Как добавить лазание по стенам в UnityВ восьмой части серии сфера получает физическое лазание. В Unity 2019.2.21f1 контакт проверяют по углу нормали: предел задают от 90° до 170°, по умолчанию 140°. Маска слоёв исключает запретные стены. Для контакта сохраняют компонент Rigidbody поверхности, поэтому сфера карабкается по движущимся объектам.На стене лазание получает приоритет над ходьбой, гравитация отключается, а управление строится относительно контакта. Горизонталь вычисляют через векторное произведение нормали и направления вверх, затем обе оси проецируют на плоскость стены. Максимальную скорость снижают до 2, ускорение задают 20 для точности.Урок Catlike Coding показывает код распознавания столкновений и движения вдоль стены. На запрещённой для лазания поверхности сфера падает.
    Image from a post by GameDev: разработка игрImage from a post by GameDev: разработка игр
  • GameDev: разработка игр

    17 Sept, 08:43

    Как построить поле направлений для волны врагов в tower defenseЕсли у десятков противников одна цель, не обязательно запускать A отдельно для каждого. Поиск в ширину можно один раз начать от цели и распространить по всей сетке. Для каждой посещённой клетки алгоритм запоминает соседнюю клетку, из которой пришёл. Если идти по этим указателям обратно, получится кратчайший маршрут к цели.Из тех же данных собирается поле направлений: в каждой клетке стрелка указывает туда, где расстояние до цели уменьшается. Новый или сдвинутый противник сразу получает готовое направление. Для сетки с разной стоимостью перемещения вместо поиска в ширину понадобится алгоритм Дейкстры.В разборе Red Blob Games есть интерактивные визуализации фронта поиска, поля расстояний и стрелок, а также заметки по реализации на Python и C++.
  • GameDev: разработка игр

    16 Sept, 19:12

    Как работает Command в игровой архитектуреКнопка может напрямую вызывать jump() или fireGun(). Command превращает вызов в объект с методом execute(). Обработчик ввода хранит команду для каждой кнопки, поэтому назначение можно заменить без переписывания его логики.Если передавать в execute() персонажа, одна команда прыжка сможет управлять любым героем. Команды создаёт и ввод игрока, и ИИ, а другой код применяет их к персонажу. Очередь между ними отделяет источник решения от исполнителя. Если команды сохраняются в передаваемом формате, их можно отправить по сети и воспроизвести на другой машине.Глава о Command в Game Programming Patterns разбирает подход на примерах C++. Получается один механизм для переназначения кнопок, управления героями через ИИ, сетевого воспроизведения и отмены действий.
  • GameDev: разработка игр

    16 Sept, 12:08

    Как в Godot 4.3 автоматизировали синхронизацию GPUВ Vulkan GPU может завершать команды не в порядке отправки. Разработчик расставляет барьеры: задаёт, какая работа должна закончиться до следующей. Старый RenderingDevice без точной маски задерживал всю последующую работу и создавал лишние барьеры.Технический разбор Godot Engine описывает новую схему: движок автоматически строит граф зависимостей без циклов между пакетами отрисовки и вычислений. Код уже находился в основной ветке и предназначался для Godot 4.3. Проекты менять не требовалось, а методы RenderingDevice стали запрашивать меньше данных.Для систем частиц на GPU ожидалось особенно заметное ускорение, для сцен с постобработкой: сокращение времени кадра примерно на 5–15%. Статья вышла в феврале 2024 года, детали API стоит сверять с документацией.
    Image from a post by GameDev: разработка игрImage from a post by GameDev: разработка игр
    1,06011Open in Telegram