habrahabr

Пара вещей, которые должен знать игровой программист

  • понедельник, 7 апреля 2025 г. в 00:00:09
https://habr.com/ru/articles/897808/
  • В std::move никто никуда не двигается

  • В undefined behavior поведение вполне себе определено, просто крашит игру

  • В GameObject нет ни игры ни объекта, а только баги и куча антипаттернов

  • Memory leak detector сам протекает

  • В PhysicsEngine физики столько же, сколько в сказке про Колобка

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

  • В ProfileMode тормозит всё кроме профайлера

  • В retrospective meeting обсуждают, почему всё плохо, но оставляют как есть.

  • В debug билде багов меньше чем в релизном и выше фпс


  • Crossplatform сборка игры компилится только на одной машине, в определенном углу офиса, на одном компиляторе, в полнолуние

  • В LevelStreaming грузится весь мир сразу

  • В С++ из игрового языка только умение играть на нервах разрабов

  • Порефакторенный легаси код начинает мстить через неделю

  • В tech debt backlog долгов больше, чем фич. Но фичи делают, а долги нет

  • В EntityComponentSystem нет ни системы, ни сущностей ни компонентов, только хаос данных и сотни несвязанных вызовов

  • QA репортит баг где описано всё, кроме того, как это воспроизвести.

  • code review фидбек приходит, когда ты уже пушнул в релиз ветку.

  • "Красивая оптимизация" от тимлида обычно роняет фпс.

  • В MVP нет ни минимального, ни жизнеспособного, ни продукта

  • В огне deadline'a умирает всё, включая атмосферу в команде.

  • В burnout prevention week нет ни отдыха, ни профилактики — просто ещё один спринт.

  • В релизном билде не работает ничего, кроме багов

  • Если прилетело "Не бойтесь, это приорити 3" — это обычно уже пожар на проде.

  • Сert submission билд обычно содержит больше 200 багов, которые захачены костылями

  • В TRC/XR/LOT правил больше, чем статей в Уголовном кодексе (у Сони 450)

  • В Xbox GDK - GDK расшифровывается как "Где Документация, Карл?"

  • В cert blocker баг возникает только у тестеров Sony в полнолуние, но чинить надо вчера.

  • В server tick тикать должен сервер, но тик начинается у тебя.

  • Prediction system ничего не предсказывает, но всё ломает.

  • В navmesh всё отлично, пока AI не решит пойти в стену.

  • В smart object system объекты умнее персонажей.

  • В decision making system решений нет, только if-else.

  • Finite State Machine умеют висеть, застревать, спотыкаться, плавать и падать

  • В "маленьком изменении уровня" обычно 200 перетаскиваний и 500 новых багов.

  • В "это просто добавить кнопку" обычно зарыто 3 дня UI-ада и конфликт с рендером.

  • "почему так дорого?" ревью приходят от людей, которые не покупали игру

  • "это всё Unity виноват!" ревью приходят, даже если игра написана на своем движке.

  • В audio system всегда есть звук, который никто не слышит (звук silence).

  • В FMOD event триггерится либо никогда, либо всегда, и описывается через флоат поле

  • Sound designer обычно присылает таски в стиле "Нужно чтобы звук был чуть живее" и скриншот - это вся таска, если что.

  • Widget UI система ничего не рендерит, но занимает 40% CPU.

  • One-click deploy работает только у того, кто его писал, на его машине, в полнолуние.

  • В Unique string ID системе ID строк дублируются, а строки теряются.

  • non-latin font обычно ломает весь UI.

  • В RTL text всё отображается справа... и снизу.

  • В voiceover актёр говорит 5 секунд, а персонаж молчит 10.

  • С письмом от продюссера "это не баг, это перевод такой" лучше не спорить.

  • В template metaprogramming нет ни меты, ни програмирования — только compile error простыня на 3 экрана.

  • В таске “добавим std::any в Х” потеряли тип, отладку и производительность.

  • В коде движка больше всего коментов, которые начинаются с // TODO.

  • Виртуальные деструкторы убивают не объекты, а производительность и иногда билд.

  • В third-party libs всё несовместимо, особенно лицензии.

  • assert(false && "should not happen") случается пару раз в день.

  • Самый частый резолв при закрытии бага - CNRD (Cant reproduce in debug|Этот баг не повторяется в дебаге)

  • В save state паттерне можно потерять только несколько часов своей жизни

  • В constexpr ты компилируешь во время компиляции

  • "Сейчас перепишем под ECS." обычно заканчивается тем, что у вас разломан движок, зато есть презентация на 60 слайдов.

  • "Мы используем свою memory arena." Теперь никто не знает, почему краш — даже Valgrind.

  • "Включили поддержку C++20." Прод билд теперь не собирается ни на одном из компиляторов

  • RAII решает всё, но создаёт циклы, которые никто не может починить

  • Инкапсуляция хорошо, но public-поле спасает релиз за 10 минут до дедлайна

  • Сигналы и слоты удобны, но баги теперь воспроизводятся рандомно

  • Мы не используем goto, но switch-case на 800 строк — норм

  • Если баг невозможен — он всё равно случится. В релизной сборке с разным стектрейсом

  • Строчки, помеченные //TMP живут дольше чем ты работаешь в студии

  • Чем ближе майстоун, тем чаще нейтрино пролетают через планки памяти и ломают биты

  • Если баг невозможно воспроизвести — игроки будут воспроизводить его каждый раз.

  • Фича, сделанная за ночь до майлстоуна, попадает в трейлер.

  • Если ты меняешь что-то "всего в одном месте" - ломается в трёх других.

  • Каждый рефакторинг удаляет кусочек истории

  • Ты знаешь, что можно лучше. Но лучше никто не просит.

  • Мы перенесли сборку в CI, теперь оно ломается само без участия программера

  • Когда-нибудь ты допишешь документацию

  • Всё, на что ты потратишь больше недели, заменят ассетами с маркета.

  • Ninja хотфикс ломает две стабильных ветки.

  • Любое ускорение загрузки приводит к трем новым таскам от художников

  • Никто не знает, как работает тот легаси код. Но если ты его трогаешь — ломается весь билд.

  • Всё, что можно было унаследовать неправильно — уже унаследовано

  • Если кто-то сказал “я почистил код” на митинге - готовься к неделе гейзенбагов

  • Фича, на которую закладывали полгода, будет отключена перед релизом из-за “низкого приоритета”.

  • Чем глупее идея, тем выше шанс, что она попадёт в релиз.

  • Техдолг — это просто еще одно вежливое название для чьих-то непофикшных багов.

  • Если билд внезапно стал стабильным, значит собрали дебаг

  • Ты не можешь уволить человека, который написал этот ад. Потому что он ушёл сам — два года назад.

  • Каждый “простой фикс” от художника отнимает день у программиста

  • Ты переписал систему ивентов, чтобы она стала понятной. Теперь её не понимает никто, включая тебя.

  • Когда тебе говорят “ничего критичного” — это всегда таска уровня "приорити 3", см. п22.

  • Если менеджер просит “по-быстрому”, значит он уже продал фичу начальству.

  • Соотношение mgr/prg кореллирует с вероятностью получить на релизе продукт, а не игру. (Тонко, но mgr обижаются)

  • Художник не знает, как работает шейдер. Геймдизайнер не знает, как работает баланс. Продюсер не знает, как работает игра.

  • Никакие баги так не страшны, как фича, описанная на кухне словами “ну ты сам поймёшь, что я имел в виду”.

  • Если билд собирается и запускается — это не значит, что он работает

  • Ты сделал всё, как было написано в таске. Но прав был тот, кто сделал всё “на глаз”. Потому что его меньше отвлекали.

  • Если патч выходит в пятницу. Значит, в выходные надо свалить подальше и отключить телефон.

  • Свет пробивается сквозь бетон, пули — нет. Это и есть физика в играх.

  • Весь проект держится на 3 людях, которых менеджмент не слушает.

  • “Ретро-стиль” — это когда художник не умеет в лайтмап и его работу делает рендер-программист.

  • Чем больше ты говоришь, что это плохая идея, тем выше шанс получить её в виде таски.

  • Вероятность увольнения прямо пропорциональна надежности системы, которую ты сделал.