Войти
Gamedev LectureСтатьи

Лекция #31. Встраивание интерпретатора C/С++ - CINT - в движок [Лектор - egge]

Автор:

<egge> перед тем как начать лекцию я хотел бы кой-че огласить
<egge> во первых пример здесь http://ifolder.ru/843324 [http://www.gamedev.ru/download/?id=4833]
<egge> во вторых пример только под линух
<egge> для компиляции понадобиться scons
<egge> http://scons.org
<egge> можно откомпилить под MinGW, но только с цинтом
<egge> там два варианта компиляции
<egge> scons -Q -h подскажет
<egge> и еще переменная среды CINTSYSDIR должна указывать на папку с цинтом
<egge> кстати я счастливый обладатель плохого инета, так что если вы увидите что я зашел второй раз, значит предыдущие сообщения не читал
<egge> ну что приступим?
-----
<egge> итак, зачем нужны скрипты
<egge> скрипты нужны чтоб не все время не компилить код
<egge> когда их меняют каждые 5 минут дизайнеры
<egge> для безопастности
<egge> правда в случае с интерпретатором с/с++ это не совсем получаетcя
<egge> безопастность в основном зависит от реализации движка
<egge> еще один плюс в с/с++ скриптах - это возможность безобидно откомпилить код в релизе вместо его интерпретации
<egge> чтобы увеличить скорость работы игры
<egge> Принцип встраивания
<egge> встраивать цинт очень просто
<egge> берем хеадеры движка, вызываемые из скриптов
<egge> обромляем все нужное ( тоесть паблики ) дефайнами
<egge> далее прогоняем через cint
<egge> на выходе получаем два файла
<egge> *.h и *.c
<egge> включив их в проэкт
<egge> можно вызывать собсно то, что мы обромляли из хеадеров движка
<egge> в скриптах
<egge> далее просто загружаем файлы и выполняем функции
<egge> как в примере
<egge> название функций в скрипте должны быть уникальными
<egge> если хотите откомпилить скрипты заранее обычным компилятором
<egge> нужно просто экспортировать свой entry_point в скриптах как это делаеться при создании длл
<egge> тоесть для винды это __declspec(dllexport) перед обьявлением
<egge> делее загружаем как длл
<egge> только handle указываем на NULL, для загрузки из текущего процесса
<egge> получаем указатель на функцию и запускаем на выполнение
<egge> загрузка как длл позволяет отладить скрипты
<egge> если нужно
<egge> вопросы?
<DobroKOT> у меня вопрос - как быстро оно парсилось.
<DobroKOT> Намного ли быстрей обычных компиляторов при сборке в релизе?
<egge> процесс сборки сильно ускорился
<DobroKOT> И, ещё - на сколько оно медленней по сравнению с Debug-кодом обычных компиляторов?
<egge> нельзя тут точно сказать на сколько, медленей
<egge> а на сколько быстрей
<egge> в нашем проэкте
<egge> фпс понизился где-то на 10
<egge> по сравнению с комерческим аналогом ch
<DobroKOT> со скольких?
<egge> с 50 до 30
<egge> *между
<egge> почему такой маленький фпс?
<egge> потому в движке было очень мало оптимизаций
<DobroKOT> это в Debug-режиме?
<egge> <egge> по сравнению с комерческим аналогом ch, цинт быстрее в несколько раз
<egge> да
<DobroKOT> а не меряли, сколько скрипты отжирают в процентах от общего?
<egge> нет
<DobroKOT> ага
<DobroKOT> Ещё у кого-нибудь вопросы?..
<DobroKOT> вопросов нет :]
<egge> Встречаемые несовместимости
<egge> первая попавшаяся на глаза несовместимость с обычным компилятором - это макросы
<egge> цинт не позволяет делать макросы
<egge> тоесть можно использовать дефайты и ифдефы
<egge> но макросы - нет
<egge> далее инициализация структур
<egge> struct s i = { 0 }; // такое нельзя делать
<egge> это мс-специфик
<egge> цинт пропустит это не выдав никакого варнинга
<egge> нелзя инициализировать структуры в структурах
<egge> struct a { int i; };
<egge> struct b { int j; };
<egge> struct c{ struct a z; struct b x; } m;
<egge> m = { {0}, {0} }; //такое не поймент цинт
<egge> m = { 0, 0 }; //такое не поймент мс-компилер
<egge> итак выводы
<egge> можно почти без изменений встраивать функции для вызова из скриптов
<egge> увеличение скорости компиляции и линковки
<egge> при изменении кода не надо его постоянно компилить
<egge> можно вбилдить в код скрипты по релизу проэкта, для увеличения скорости выполнения
<egge> минусы:
<egge> безопастность кода очень низкая и зависить напрямую от интерфейса движка
<egge> некоторые несовместимости с компиляторами
<egge> вопросы есть?
<Juster> в каких проектах использовали?
<egge> использовалась для детской аркадной игры, которая еще вышла
<KASiak> не вышла?
<egge> нет
<egge> кстати извиняюсь что лекция может прошла может не очень интересно
<egge> это первый выход мой в свет

11 января 2007

Комментарии [3]