Пара докладов с GDC ~2012
Robustification Through Introspection and Analysis Tools (Avoiding Developer Taxes)
Physics for Game Programmers: Debugging Physics
“Налоги” — это то, что непосредственно не приносит пользу продукту, но упрощает жизнь. Примеры для геймдева — сериализация, статистика памяти, привязка к скриптам, версионирование
Примеры того, что сделали, распарсив код с помощью Clang:
Сериализация
struct A0 {float x; byte y;} |
Можно отследить по диффам изменения форматов и генерировать код сериализации/десериализации для разных версий структуры + отслеживать перемещение полей между структурами
Slim bindings
“Трамплины” для обвязок функций для скриптого языка
typedef int (*func_int__int_charptr)(int i, char* c) //для каждого типа сигнатур |
В трамплин передаётся структура, описывающая сигнатуру функции. Делается ради экономии места в бинарнике на сгенерированных скриптовых lua-привязках — вместо создания кода привязки для каждой отдельной функции создаётся трамплин для каждой функции и описания данных для трамплина. Требует одной дополнительной индирекции на каждый вызов функции. Можно даже шарить трамплины между разными привязками к языкам (lua_bridge/python_bridge)
Подсчёт используемой памяти в рантайме
Если для каждого типа знаем его структуру и размер, то можем просуммировать и вывести отчёт с визуализацией
Внешние тулзы для просмотра типов
- можно просмотреть, какие типы POD и хорошо сериализуются, а какие требуют runtime-цикла с сериализацией отдельных членов
- по json с описанием типов можно восстановить padding в структурах, визуально
А также дифф этого из vcs
- Расположение объектов C++ в памяти. Часть 2 — другие попытки получить padding в структурах
Передача blob-а и десериализация в другом процессе
Данные из игры выдёргиваются и передаются в программу отладки физики