Coffee break

«Ctrl-Alt-F7» и курящие закурили, а некурящие пошли выпить чашечку йаду.

Когда-то мой rule of tumb был такой: “если оно компилится+линкуется больше 5 минут с нуля или больше 30 секунд от изменений, то надо что-то менять”. Иначе можно и сандали откинуть – табак убивает, а кофе вредный.

Сперва добиваться 5 минут можно всякими тривиальными способами. Несложно настроить precompiled headers; чуть погодя их можно даже настроить раздельно для разных кусков внутри одного проекта. Несложно уменьшить число либ и проектов; невероятно, но факт, такое помогает. Неплохо вынести разное в dll – можно компилить кусками, а собирать в статике только финальный билд.

Погодя добиваться 5 минут становится сложнее. Надо убирать всякое из H\HPP и выносить в CPP. Надо волевым решением перестать пользоваться boost-ом (а лучше не начинать). Надо волевым решением перестать заниматься выпиливанием лобзиком по шаблонам, и прочим метапрограммированием (а лучше не начинать). Надо выносить игровой код (и прочий мусор) в скрипт. Надо натравить утилиты про coverage и выкинуть (или хотя-бы закомментировать) лишнее. Надо натравить утилиты про copy-paste и вынести общий код в функции.

В конце добиваться 5 минут становится значительно легче. Надо перенести утилиты в C# – тот компилит где-то на два порядка быстрее. Код утилит часто препоганый; тот факт, что стало быстрее (или медленнее) работать всё равно никто не заметит. А ещё на C# очень легко писать многонитевые приложения под 64 бита – можно купить 4-ядерный процессор, поставить 64-битную висту, и будет щастье.

Гораздо лучше, комфортнее, добиваться 3-х минут. Давайте писать на С. Ну, может, на С с классами. И со скриптом, какой релоадится на лету. Петон. Луа. С#. Small. Только свой не пишите – внятный не осилите. А рантайм можно тонкий и на C.

Ещё комфортнее и легче добиваться 30 секунд. Игра пишется на C#. Там где станет совсем-совсем плохо, игра пишется на C. 2-3 вставками. Ах, как бы я хотел шутить, но таки нет: вам не нравится интервью имени Баткина? – пишите на С#, конечный результат и сроки будут радовать куда больше, уверяю вас. Есть все шансы осилить в разумном качестве за разумное время. Надо только писать на C# не как-если-бы на C с классами – пользоваться анонимными делегатами, писать итераторы; целиться в меньше кода.

Впрочем, если у вас убершейдеры – вам уже ничего не поможет. Кроме как переписать скрипт, чтобы он генерил make-file или вообще проект под incredibuild. Пусть вся контора компилит ваши изменения. Опять же хороший способ сделать из 5-и минут 3, или 2. Только сделайте отдельный конфиг с другими precompiled headers, покороче.

Наконец, можно освоить yacc & lex (которые flex & bison, которые ANTLR, которые FPARSEC). И написать красивый DSL, который в свою очередь генерит … таблицы. Но это уже тема для отдельной неинтересной истории. C# -> C++ конвертор, anyone?

Вот такая лирика. А покамест выпью чашечку йаду. ctrl-alt-f7. see ya

  • kayru

    Даже с инкредибилдом и делением на длл-ки проект компилится с нуля минут 20 (а релиз билд и все 30). 80% из этого всего – игра и только 20 тулзы и либзы =\ Пипец просто.

  • http://www.vogster.com raskolnikov

    неподходит..
    игровая логика вся в скриптах, а весь ребилд занимает 7 минут
    ничего с этим не сделаеш, только куски базовые из движка выковыривать да мидлварю в либы пихать (ох как не хочется на этапе дебага этого делать)

  • Sergei_am

    Вот, расскажи про убершейдера – ето про идею, или конкретно так?
    У нас ими страдаю в основном я, да еще 1.5 человек, страдает билд, но в целом добро струится из всех дър, типа unified lighting аля как в любимом тобой Doom 3…
    В целом, со временем все тверже зреет мнение, что надо твердо сказать ‘нет’ комбинаторному взръву и примерно послать всех кто не хочет ‘хейтфок’ на сгорание видеокарточке…

    А так, по теме, мъ скажем въносили флаги, тайпдефс и всякое такое в отдельнъе хидеръ, общие для подсистем – оказъвалось что объчно из-за них инклудилось все на свете.
    Про скрипт и релоад на лету – ++. Тулзъ на C# – хоть на Lua, лиш бъ не C++.

  • http://virtul.livejournal.com virtul

    Спасибо, каждый пост просветляет :) Интересно было бы про шарп почитать ;)

  • look4awhile

    2 sergei_am: комбинаторный взрыв – это проблемы компилятора. который не умеет прозрачно и бесплатно собирать шейдеры из кусков на лету. т-е идея в том, что заранее получается оптимизировать лучше. почему так – тема для отдельного “раскрыть”. т-е есть статические branch bits, но они работают так, что лучше-бы не работали. там вообще компилятор шейдеров работает так, что хочется плакать. грабли на уровне железки. грабли на уровне АПИ. и просто грабли. посему убершейдеры очевидно решение. переносим с больной головый на здоровую.

    тот самый графический АПИ в его теперешнем виде – он целиком именно про это. с больной головы на здоровую. проблемы разработки игр он не решает – он решает совсем другие проблемы. но это вообщем-то тема отдельного ранта.

    2 raskolnikov: в “ничего с этим не сделаешь” не верю. согласный сделать за деньги.

    2 virtul: будет и про шарп. погодя

  • http://plakhov.livejournal.com Finder

    2 look4awhile 2 raskolnikov: у них UE3. ничего с этим не сделаешь за разумное время и деньги. а как сделаешь, так от эпиков сразу апдейт придет.

  • look4awhile

    UE3? сдаюсь.
    там ещё со времён UE1 ничего сделать было нельзя за разумное время либо деньги.

  • http://www.sdl.ru TSS

    Сборка всего проекта — этап ответственный и, как правило, скорость сборки никого не волнует. Проблемы начинаются, когда проет организован как слубок ниток в котором некоторое время резвился кошак. Кстати, добавлю — не пользуйтесь Intel-компилятором – он раза в три тормознутее обычного MSVC, даже если в последнем включить все оптимизации…
    Шаблоны реально тормозят сборку, поэтому не только буст, но и СТЛ запихиваем в ту же задницу. И инкредибилд тут особо не поможет.

    На счет C# — +100. Максимальную потерю производительности наблюдал только когда программировал сложную математику, и то потери была в пределах 10% от “эталонного” Си (С++ практически не юзался)

  • kayru

    Ради интереса, скажи-ка (если не секрет) сколько у вас в проекте отдельных файлов, сколько из них хедеры и сколько всего LOC?

  • IronPeter

    Я в принципе пытался сделать макроассемблер шейдеров. На RSX. Исходя из семантики ассемблера от NV, вставив в код конструкции условного управления. Дефайны и циклы. Фрагменты заранее прекомпилируются, все в принципе работает. Оно в рантайме собирается. И не сложно. Реально не сложнее той работы, которую я сделал для компилятора HLSL юбершейдеров на работе.

    В рантайм лезут куски говна. Какие-то там in out маски для шейдера вычисляются, число регистров надо указывать. На наивном уровне это говно легкое. Можно на spu job по генерации шейдеров засунуть и не париться.

    У меня не было и нет инфы про спаривание команд. Я не реверсил. Официальная информация, что за такт можно запустить 2 coissued ALU ( 3 + 1 ) + TEX. Чем ебанутее правила спаривания – тем сложнее разбивать на группы. Не знаю, являются ли в случае RSX правила спаривания препятствием для рантайм склеивания. Могу пореверсить.

  • http://aruslan.livejournal.com/ aruslan

    > Сборка всего проекта — этап ответственный и, как правило, скорость сборки никого не волнует.

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

  • Riz

    >C# -> C++ конвертор, anyone?
    Как насчёт Vala?
    http://live.gnome.org/Vala/
    Фактически C# -> C

  • Sergei_am

    aruslan, +1
    Из-за такого, иногда бъвали случаи когда билд не удается сделать один день, из-за волнообразного бага, которъй идет дальше по пайплайну, а проверка билдом занимает долгое время.

  • http://www.visual3d.net arilou

    look4awhile, вы пишите в своем проекте игровую логику на шарпе? А какой проект?

  • GeneralGDA

    А что все так за C#? Ещё Java есть.

  • look4awhile

    к java нативный код прикручивается шикбо трудами ненужными. потому и C#

  • lenik

    вместо симиана, для которого нужно ставить жабу или развесистый дот.нет, проще использовать http://www.anticutandpaste.com/

  • GeneralGDA

    for look4awhile:
    Да всё там просто прикручивается. Конечно, если мест перехода native-java(или managed) будет беcконтрольно много, то тяжело. У нас в проекте это главный геморой. Ещё смешная штука получается когда приложение падает с call-stack’ом native->java->native. При таком раскладе получается только через Ж раздобыть callstack, так как в яве вызов native кода в __try/__catch обёрнут. В остальном полный кайф. Особенно среды разработки радуют.

  • http://www.jphysx.com jorgen

    2 look4awhile: С++ экспортируется для Java автоматом – http://www.swig.org
    Вот чего он так же умеет:

    AllegroCL, C# – Mono, C# – MS .NET, CFFI, CHICKEN, CLISP, Guile, Java, Lua, MzScheme, Ocaml, Octave, Perl, PHP, Python, R, Ruby, Tcl/Tk

    Я им экспортировал PhysX для Java (www.jphysx.com) – заэскспортилось – всё (даже кол-бэки через интерфейсы).
    Ну и понятно – захотели поменять язык (с луа на яву к примеру, или на шарп) – меняем просто инструкции генератора.