Как Godot исправил просадки FPS от мышей на 8 кГц
Мышь с высокой частотой опроса может отправлять тысячи событий в секунду. В Windows поток сообщений способен перегрузить обработку ввода: до исправления быстрое движение мышью на 8 кГц почти останавливало тестовую сцену Godot.
Исправление вошло в Godot 4.7.2. События raw input читаются пакетами, а обычные сообщения движения мыши обрабатываются отдельно, не чаще одного раза за кадр. Клавиши, кнопки и колесо продолжают работать по прежней схеме.
Это полезный повод проверить обработчики
Разбор команды Godot
Мышь с высокой частотой опроса может отправлять тысячи событий в секунду. В Windows поток сообщений способен перегрузить обработку ввода: до исправления быстрое движение мышью на 8 кГц почти останавливало тестовую сцену Godot.
Исправление вошло в Godot 4.7.2. События raw input читаются пакетами, а обычные сообщения движения мыши обрабатываются отдельно, не чаще одного раза за кадр. Клавиши, кнопки и колесо продолжают работать по прежней схеме.
Это полезный повод проверить обработчики
_input() и _unhandled_input() в своём проекте. Дорогая логика на каждом движении мыши всё ещё может съедать время кадра, особенно при отключённом накоплении ввода.Разбор команды Godot
Godot Engine
Fixing high polling rate mice on Windows in Godot – Godot Engine
At long last, a performance issue with high polling rate mice on Windows has been fixed. This article describes how the fix works, and why it's so important today.
❤2
Как выбрать способ оптимизации шейдера в UE5
Граф Material Editor уже компилируется в HLSL. При этом Custom Expression может ограничить свёртку констант и дать больше инструкций, чем те же операции, собранные стандартными узлами.
Начать стоит с замеров:
Для обычного материала подходят узлы и Material Functions. Небольшую нестандартную формулу можно вынести в Custom Expression, а отдельный вычислительный проход — в Global Shader с RDG.
В разборе для UE5 показано, как выбирать уровень реализации и сравнивать результат на целевой платформе.
Граф Material Editor уже компилируется в HLSL. При этом Custom Expression может ограничить свёртку констант и дать больше инструкций, чем те же операции, собранные стандартными узлами.
Начать стоит с замеров:
stat unit помогает найти ограничивающий этап, а stat gpu и ProfileGPU — дорогие проходы. На стоимость материала влияют площадь экрана, перекрытие прозрачных объектов и обращения к текстурам.Для обычного материала подходят узлы и Material Functions. Небольшую нестандартную формулу можно вынести в Custom Expression, а отдельный вычислительный проход — в Global Shader с RDG.
В разборе для UE5 показано, как выбирать уровень реализации и сравнивать результат на целевой платформе.
DEV Community
UE5 Shader Optimization: Materials, Custom HLSL, and Global Shaders with RDG
When a material graph grows in Unreal Engine 5, it is tempting to ask: would writing HLSL directly...
Как убрать рывки движения других игроков
Допустим, сервер отправляет состояние мира десять раз в секунду. Если сразу переносить чужого персонажа в полученную позицию, он будет прыгать между точками каждые 100 мс.
Интерполяция использует два известных серверных состояния и плавно меняет положение между ними. Для этого клиент показывает других игроков с небольшой задержкой: в примере Габриэля Гамбетты она составляет 100 мс.
Получается, свой персонаж может реагировать на ввод сразу через клиентское предсказание, а остальные двигаются по уже полученным данным. Цена плавности — отображение их прошлого положения, что нужно учитывать при расчёте попаданий.
Разбор интерполяции с наглядными примерами помогает понять эту схему без привязки к конкретному движку.
Допустим, сервер отправляет состояние мира десять раз в секунду. Если сразу переносить чужого персонажа в полученную позицию, он будет прыгать между точками каждые 100 мс.
Интерполяция использует два известных серверных состояния и плавно меняет положение между ними. Для этого клиент показывает других игроков с небольшой задержкой: в примере Габриэля Гамбетты она составляет 100 мс.
Получается, свой персонаж может реагировать на ввод сразу через клиентское предсказание, а остальные двигаются по уже полученным данным. Цена плавности — отображение их прошлого положения, что нужно учитывать при расчёте попаданий.
Разбор интерполяции с наглядными примерами помогает понять эту схему без привязки к конкретному движку.
❤1
Как Godot ускорил анимацию Polygon2D
В тестовом проекте вершины Polygon2D анимировались через AnimationPlayer. Профилировщик показал, что движок каждый кадр пересоздавал внутренний меш: удалял старые массивы вершин, создавал новые и загружал данные заново.
Когда число вершин остаётся прежним, можно обновлять данные уже существующего меша. Команда Godot выделила подходящие случаи и использовала этот путь вместо постоянного пересоздания.
В демонстрационной сцене на Ryzen 5 9600X время кадра сократилось примерно с 35 до 13 мс. Результат относится к этому сценарию анимации.
Разбор с профилями до и после показывает весь ход поиска: от жалобы на медленную анимацию до конкретных затрат на создание и освобождение мешей.
В тестовом проекте вершины Polygon2D анимировались через AnimationPlayer. Профилировщик показал, что движок каждый кадр пересоздавал внутренний меш: удалял старые массивы вершин, создавал новые и загружал данные заново.
Когда число вершин остаётся прежним, можно обновлять данные уже существующего меша. Команда Godot выделила подходящие случаи и использовала этот путь вместо постоянного пересоздания.
В демонстрационной сцене на Ryzen 5 9600X время кадра сократилось примерно с 35 до 13 мс. Результат относится к этому сценарию анимации.
Разбор с профилями до и после показывает весь ход поиска: от жалобы на медленную анимацию до конкретных затрат на создание и освобождение мешей.
Godot Engine
Optimizing CPU-side Rendering Code – Godot Engine
Optimizing CPU code is a lot of fun. Here’s how we do it
❤1
Почему окрестности 5×5 недостаточно для ячейки Вороного
Один из способов строить процедурные регионы — взять квадратную сетку и случайно разместить по точке в каждой клетке. Чтобы вычислить полную ячейку Вороного, обычно строят диаграмму для локальной окрестности.
Борис из BorisTheBrave показал, что привычная область 5×5 может дать неверную границу: точка из клетки со смещением (3, 1) тоже способна на неё повлиять.
Автор определил набор из 36 соседних клеток, каждая из которых может оказаться значимой, и приложил формальное доказательство в Lean.
Это результат для вычисления полной ячейки. У поиска ближайшей точки для шума Worley свои требования к окрестности.
Контрпример и доказательство полезны для проверки генератора регионов или процедурной геометрии.
Один из способов строить процедурные регионы — взять квадратную сетку и случайно разместить по точке в каждой клетке. Чтобы вычислить полную ячейку Вороного, обычно строят диаграмму для локальной окрестности.
Борис из BorisTheBrave показал, что привычная область 5×5 может дать неверную границу: точка из клетки со смещением (3, 1) тоже способна на неё повлиять.
Автор определил набор из 36 соседних клеток, каждая из которых может оказаться значимой, и приложил формальное доказательство в Lean.
Это результат для вычисления полной ячейки. У поиска ближайшей точки для шума Worley свои требования к окрестности.
Контрпример и доказательство полезны для проверки генератора регионов или процедурной геометрии.
BorisTheBrave.Com
Minimal Neighborhoods for Evaluating Jittered Voronoi Grids
I’ve spoken several times about jittered Voronoi grids, such as here. These are infinite Voronoi diagrams where the sites come from randomly picking a point from each square in a square grid.…
❤1
Как ошибки QuadriFlow срывали ретопологию моделей SketchUp
Автор skpforge, инструмента подготовки ассетов для Unreal Engine 5, перенёс основной маршрут QuadriFlow на Rust. На моделях SketchUp обнаружились две ошибки исходной реализации: неверные связи полурёбер зацикливали обработку, а недостижимый код оставлял проблемные вершины неразделёнными.
После исправлений автор занялся максимальным потоком, который отнимал значительную часть времени ретопологии. На его данных алгоритм Бойкова — Колмогорова оказался удачнее Dinic.
На одной тяжёлой модели время обработки в Rust-порте сократилось с 441 до 137 секунд после замены решателя. Это измерение конкретного случая; сравнения с upstream в статье дают разные результаты в разных тестах.
Разбор ошибок, замеров и кода порта
Автор skpforge, инструмента подготовки ассетов для Unreal Engine 5, перенёс основной маршрут QuadriFlow на Rust. На моделях SketchUp обнаружились две ошибки исходной реализации: неверные связи полурёбер зацикливали обработку, а недостижимый код оставлял проблемные вершины неразделёнными.
После исправлений автор занялся максимальным потоком, который отнимал значительную часть времени ретопологии. На его данных алгоритм Бойкова — Колмогорова оказался удачнее Dinic.
На одной тяжёлой модели время обработки в Rust-порте сократилось с 441 до 137 секунд после замены решателя. Это измерение конкретного случая; сравнения с upstream в статье дают разные результаты в разных тестах.
Разбор ошибок, замеров и кода порта
DEV Community
Porting the QuadriFlow quad remesher to Rust: two upstream bugs and a max-flow surprise
A dependency-free Rust port of QuadriFlow for SketchUp to Unreal: two upstream bugs that hang it on T-junctions, and why Boykov-Kolmogorov beat Dinic.
❤1
Как Unity загружает ассеты по отдельности
Одному персонажу нужна текстура, а её AssetBundle тянет за собой другие данные. Размер и состав пакетов приходится продумывать заранее: они влияют и на загрузку, и на расход памяти.
В Unity 6.6 появились content directories. Меши, текстуры и другие артефакты можно загружать и освобождать независимо. Манифест хранит зависимости, а адресация по содержимому помогает устранять дубликаты.
Разбор устройства content directories показывает сборку, асинхронную загрузку и новый тип ссылок Loadable<T>. В текущей версии технология работает с контентом, поставляемым вместе с Player. Полноценная доставка отдельных ассетов по сети заявлена для поколения Unity 7.
Одному персонажу нужна текстура, а её AssetBundle тянет за собой другие данные. Размер и состав пакетов приходится продумывать заранее: они влияют и на загрузку, и на расход памяти.
В Unity 6.6 появились content directories. Меши, текстуры и другие артефакты можно загружать и освобождать независимо. Манифест хранит зависимости, а адресация по содержимому помогает устранять дубликаты.
Разбор устройства content directories показывает сборку, асинхронную загрузку и новый тип ссылок Loadable<T>. В текущей версии технология работает с контентом, поставляемым вместе с Player. Полноценная доставка отдельных ассетов по сети заявлена для поколения Unity 7.
Как разделить предметы и слоты инвентаря в Godot
Двадцать стрел в рюкзаке имеют одно описание и количество 20. Хранить название, иконку и свойства заново в каждом слоте нет необходимости.
В разборе инвентаря на Resource ItemData содержит общие данные предмета, а ItemSlot — ссылку на него и количество. Для оружия, щитов и расходников используются отдельные типы ресурсов; конкретные предметы настраиваются в .tres-файлах.
Логика инвентаря добавляет предметы в стеки, ищет подходящие и пустые слоты, уменьшает количество при удалении. Такое разделение позволяет менять описание предмета отдельно от содержимого рюкзака. Код экипировки — следующий шаг: наличие WeaponItemData само по себе его не реализует.
Двадцать стрел в рюкзаке имеют одно описание и количество 20. Хранить название, иконку и свойства заново в каждом слоте нет необходимости.
В разборе инвентаря на Resource ItemData содержит общие данные предмета, а ItemSlot — ссылку на него и количество. Для оружия, щитов и расходников используются отдельные типы ресурсов; конкретные предметы настраиваются в .tres-файлах.
Логика инвентаря добавляет предметы в стеки, ищет подходящие и пустые слоты, уменьшает количество при удалении. Такое разделение позволяет менять описание предмета отдельно от содержимого рюкзака. Код экипировки — следующий шаг: наличие WeaponItemData само по себе его не реализует.
❤1
Как собрать физическую дверь или мост в PlayCanvas
Дверь должна вращаться вокруг петли, а доски подвесного моста — проседать под нагрузкой. Для такого поведения подходят соединения rigid body: они ограничивают движение тел относительно друг друга.
В PlayCanvas Editor 2.32 Joint-компонент можно полностью настроить в инспекторе. Доступны Fixed, Ball, Hinge, Slider и 6DoF. У шарнира есть пределы вращения и мотор, у соединений — порог импульса для разрушения.
Разбор Joint-компонента показывает настройки и примеры применения. Для работы нужны Ammo и rigidbody у связанных объектов. Если второе тело не указать, соединение закрепит первое в пространстве мира. Пружины и ограничения по отдельным осям настраиваются через 6DoF.
Дверь должна вращаться вокруг петли, а доски подвесного моста — проседать под нагрузкой. Для такого поведения подходят соединения 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.
Сцену выгрузили, её объекты уничтожены, а расход памяти почти не изменился. Одна из причин — статическая ссылка или подписка на событие продолжает удерживать управляемую часть объекта.
В предварительной версии Memory Profiler 1.2.0-pre.1 появилась таблица Roots & Impact. Она показывает, какие корни удерживают объекты и сколько памяти связано с этими цепочками ссылок. Можно отдельно посмотреть статики, сцены и AssetBundle.
Разбор нового представления объясняет поиск Leaked Managed Shells и фильтрацию утечек по размеру. Место создания объекта не всегда объясняет, почему он до сих пор жив: здесь полезнее проследить удерживающие ссылки. Пакет пока имеет статус pre-release.
❤1
Как связать рычаг и мост из разных сцен в Godot
Рычаг переключает мост, а при переходе между сценами состояние должно сохраняться. Прямая ссылка на узел моста становится неудобной, если его сцена ещё не загружена.
В разборе системы переключателей связь проходит через SwitchBus, добавленный в Autoload. SwitchTrigger меняет значение переключателя, а SwitchMonitor следит за ним. Оба используют один идентификатор.
Рычаг получает область взаимодействия и меняет состояние триггера. Мост реагирует через монитор и AnimationPlayer. Объекты можно разместить в разных сценах: посредник хранит состояние между переходами. Для сохранения после закрытия игры понадобится отдельно записывать эти данные на диск.
Рычаг переключает мост, а при переходе между сценами состояние должно сохраняться. Прямая ссылка на узел моста становится неудобной, если его сцена ещё не загружена.
В разборе системы переключателей связь проходит через SwitchBus, добавленный в Autoload. SwitchTrigger меняет значение переключателя, а SwitchMonitor следит за ним. Оба используют один идентификатор.
Рычаг получает область взаимодействия и меняет состояние триггера. Мост реагирует через монитор и AnimationPlayer. Объекты можно разместить в разных сценах: посредник хранит состояние между переходами. Для сохранения после закрытия игры понадобится отдельно записывать эти данные на диск.
❤1
Что 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 связаны с анонсом.
Цветной текст, встроенные спрайты и анимированные надписи теперь можно делать средствами Defold. В версии 1.13.2 rich text появился у Label-компонентов и текстовых GUI-узлов.
Для 3D-проектов расширился Lua API Bullet: доступны миры, тела, формы и ограничения. Добавились collision meshes для подробной статической геометрии. Редактор также получил HTTP-методы для сборки и запуска проектов.
Разбор релиза перечисляет новые возможности и изменения при обновлении. В существующем проекте стоит проверить собственные HTML-шаблоны, настройки Android R8 и переименованную константу события окна. Полные release notes связаны с анонсом.
❤1
Как SuperSplat сократил память для тяжёлых 3D-сцен
В Gaussian Splat-сцене могут быть миллионы элементов. Если держать полные копии данных в JavaScript, загрузка и экспорт быстро упираются в память браузера.
SuperSplat Editor 3.0 перенёс проекцию, отсечение, сортировку и операции выделения на GPU. Данные хранятся порциями в GPU storage, экспорт тоже идёт по частям.
В разборе перехода на WebGPU приводят сцену из 4,4 млн сплатов: JavaScript heap в загруженном состоянии снизился с 1557 до 105 МБ. Это замер памяти JavaScript, он не включает всю память GPU.
Новый редактор требует WebGPU. Для тяжёлых сцен есть режим Stochastic Alpha: во время движения он позволяет временно обходиться без дорогой сортировки.
В Gaussian Splat-сцене могут быть миллионы элементов. Если держать полные копии данных в JavaScript, загрузка и экспорт быстро упираются в память браузера.
SuperSplat Editor 3.0 перенёс проекцию, отсечение, сортировку и операции выделения на GPU. Данные хранятся порциями в GPU storage, экспорт тоже идёт по частям.
В разборе перехода на WebGPU приводят сцену из 4,4 млн сплатов: JavaScript heap в загруженном состоянии снизился с 1557 до 105 МБ. Это замер памяти JavaScript, он не включает всю память GPU.
Новый редактор требует WebGPU. Для тяжёлых сцен есть режим Stochastic Alpha: во время движения он позволяет временно обходиться без дорогой сортировки.
❤2
Как масса влияет на бросок шара в Unity
Шар запускается вперёд, сталкивается с кеглей и почти останавливается. В учебной сцене причина может быть простой: у шара и кеглей одинаковая масса.
В разборе боулинга на Unity бросок выполняется через Rigidbody.AddForce с ForceMode.Impulse. Импульс применяется сразу и учитывает массу: более тяжёлому шару для той же скорости нужен больший импульс.
Кеглю собирают из Capsule Collider и небольшого Box Collider у основания. Модель остаётся дочерним объектом, физические компоненты размещаются на родительском. UI-кнопка вызывает публичный метод броска. На этом примере удобно проверить соотношение масс и форму коллайдеров до настройки сложной игровой физики.
Шар запускается вперёд, сталкивается с кеглей и почти останавливается. В учебной сцене причина может быть простой: у шара и кеглей одинаковая масса.
В разборе боулинга на Unity бросок выполняется через Rigidbody.AddForce с ForceMode.Impulse. Импульс применяется сразу и учитывает массу: более тяжёлому шару для той же скорости нужен больший импульс.
Кеглю собирают из Capsule Collider и небольшого Box Collider у основания. Модель остаётся дочерним объектом, физические компоненты размещаются на родительском. UI-кнопка вызывает публичный метод броска. На этом примере удобно проверить соотношение масс и форму коллайдеров до настройки сложной игровой физики.
✍1
Как уложить замысел игры в одну страницу
В большом дизайн-документе легко потерять основной цикл: что игрок делает снова и снова и ради чего возвращается к этим действиям.
One-page GDD помогает сначала собрать общую картину. В коротком документе связываются основной игровой цикл, составляющие его механики и особенность, по которой проект будет узнаваем.
Пример такого GDD показывает подход к организации этих элементов и возможность позже развернуть документ в подробный.
Для собственного прототипа можно начать с цепочки действий игрока и отметить, какая механика меняет привычный опыт. Если связи между действиями пока неясны, их стоит проверить в прототипе перед детализацией уровней и контента.
В большом дизайн-документе легко потерять основной цикл: что игрок делает снова и снова и ради чего возвращается к этим действиям.
One-page GDD помогает сначала собрать общую картину. В коротком документе связываются основной игровой цикл, составляющие его механики и особенность, по которой проект будет узнаваем.
Пример такого GDD показывает подход к организации этих элементов и возможность позже развернуть документ в подробный.
Для собственного прототипа можно начать с цепочки действий игрока и отметить, какая механика меняет привычный опыт. Если связи между действиями пока неясны, их стоит проверить в прототипе перед детализацией уровней и контента.
✍2
Как Godot переименовывает символы с учётом контекста
Переменная называется speed в нескольких методах. Простая замена текста затронет все совпадения, включая комментарии и строки, хотя изменить нужно только одну переменную.
В Godot 4.8 dev 7 появился инструмент переименования символов. Он учитывает контекст: различает идентификаторы классов, локальные переменные с одинаковыми именами, строки и комментарии.
В разборе предварительной сборки показаны примеры такого рефакторинга. Функция пока экспериментальная и требует отдельного включения.
Это возможность для проверки на копии проекта: переименовать символ и просмотреть изменения во всех затронутых скриптах. Godot 4.8 dev 7 пока остаётся сборкой для тестирования.
Переменная называется speed в нескольких методах. Простая замена текста затронет все совпадения, включая комментарии и строки, хотя изменить нужно только одну переменную.
В Godot 4.8 dev 7 появился инструмент переименования символов. Он учитывает контекст: различает идентификаторы классов, локальные переменные с одинаковыми именами, строки и комментарии.
В разборе предварительной сборки показаны примеры такого рефакторинга. Функция пока экспериментальная и требует отдельного включения.
Это возможность для проверки на копии проекта: переименовать символ и просмотреть изменения во всех затронутых скриптах. Godot 4.8 dev 7 пока остаётся сборкой для тестирования.
❤2
Как перейти с EDM4U на менеджер зависимостей Unity
Реклама, аналитика и покупки приносят в мобильную игру собственные Android- и iOS-библиотеки. Их версии могут конфликтовать ещё до запуска приложения.
Unity выпустила официальный External Dependency Manager через UPM. Он основан на EDM4U и читает те же XML-файлы зависимостей. Пакет бесплатен для Unity 2022.3 и новее; Google объявила deprecation EDM4U на 26 октября.
В инструкции перехода предлагают установить EDM и выбрать активный менеджер. Если EDM4U пришёл вместе со сторонним SDK, его советуют оставить до обновления этого SDK. После переключения стоит проверить сборки обеих платформ и разрешение нативных зависимостей.
Реклама, аналитика и покупки приносят в мобильную игру собственные Android- и iOS-библиотеки. Их версии могут конфликтовать ещё до запуска приложения.
Unity выпустила официальный External Dependency Manager через UPM. Он основан на EDM4U и читает те же XML-файлы зависимостей. Пакет бесплатен для Unity 2022.3 и новее; Google объявила deprecation EDM4U на 26 октября.
В инструкции перехода предлагают установить EDM и выбрать активный менеджер. Если EDM4U пришёл вместе со сторонним SDK, его советуют оставить до обновления этого SDK. После переключения стоит проверить сборки обеих платформ и разрешение нативных зависимостей.
Как начислять очки за победу над врагом в Godot
Враг может исчезнуть после смерти, телепортироваться или выйти из боя. Если начислять очки при любом удалении узла, игрок получит награду и за события, к которым не причастен.
В разборе системы очков награда привязана к сигналу depleted ресурса здоровья. Сигнал вызывает метод отдельного ScorePoint-компонента, который уже обновляет общий счёт.
Объекты получают компонент с нужным количеством очков. Работа с Autoload-счётчиком сосредоточена в одном месте: дверям, противникам и предметам не приходится напрямую вызывать singleton.
При добавлении нового способа исчезновения врага важно проверить, какое событие запускает награду. В этом примере условие — исчерпание здоровья.
Враг может исчезнуть после смерти, телепортироваться или выйти из боя. Если начислять очки при любом удалении узла, игрок получит награду и за события, к которым не причастен.
В разборе системы очков награда привязана к сигналу depleted ресурса здоровья. Сигнал вызывает метод отдельного ScorePoint-компонента, который уже обновляет общий счёт.
Объекты получают компонент с нужным количеством очков. Работа с Autoload-счётчиком сосредоточена в одном месте: дверям, противникам и предметам не приходится напрямую вызывать singleton.
При добавлении нового способа исчезновения врага важно проверить, какое событие запускает награду. В этом примере условие — исчерпание здоровья.
❤2
Forwarded from Нейроканал
Вспомните последний раз, когда ИИ сделал для вас рабочий результат: код, тесты, документацию или требования. Как вы его проверяли?
Anonymous Poll
16%
Внимательно разобрал сам
35%
Проверил на практике: тесты, запуск, реальные данные
27%
И разобрал, и проверил на практике
1%
Отдал на ревью коллеге
12%
Не проверял, сразу использовал
5%
Не было такого случая или не помню
3%
Другое (напишу в комментариях)
👎2
Forwarded from Нейроканал
Showboat и Rodney помогают показать работу ИИ-агента
Саймон Уиллисон собирает демонстрации кода с помощью двух своих инструментов. Showboat выполняет команды и записывает их вывод в документ. Rodney управляет Chrome из командной строки и делает скриншоты интерфейса.
Эту команду автор предлагает дать агенту: в справке есть всё необходимое, чтобы тот создал документ с демонстрацией новой функции.
Уиллисон замечал и обход механизма: агент напрямую правит текст отчёта. Тогда записанный вывод может расходиться с реальным запуском. Содержимое демонстрации тоже требует проверки.
#ии #инструменты
Саймон Уиллисон собирает демонстрации кода с помощью двух своих инструментов. Showboat выполняет команды и записывает их вывод в документ. Rodney управляет Chrome из командной строки и делает скриншоты интерфейса.
uvx showboat --helpЭту команду автор предлагает дать агенту: в справке есть всё необходимое, чтобы тот создал документ с демонстрацией новой функции.
Уиллисон замечал и обход механизма: агент напрямую правит текст отчёта. Тогда записанный вывод может расходиться с реальным запуском. Содержимое демонстрации тоже требует проверки.
#ии #инструменты
💔2