2013-04-01 5 views
3

Итак, я смотрел это видео месяца назад, где Epic продемонстрировала свои новые функции разработчика Unreal Engine 4. Извините, я не смог найти видео, но я попытаюсь изо всех сил объяснить.C++ компиляция во время выполнения

Единственной особенностью, которая привлекла мое внимание, была модификация и компиляция C + + «на лету». Парень показал, как он играл в игру в редакторе и модифицировал некоторые переменные в коде, сохранил его, и изменения сразу отразились в игре.

Так что я задавался вопросом ... Как добиться этого? В настоящее время я могу думать о двух возможных способах: либо обман, и это был только «c-стиль» - язык сценариев, а не сам C++ или его общая библиотека (читая: DLL).

Вот что-то я взбитыми попробовать себя (упрощенно):

for(;;) 
{ 
    Move DLL from build directory to execution directory 
    Link to DLL using LoadLibrary()/dlopen() and fetch a pointer to function "foo()" from it 
    for(;;) 
    { 
     Call the function "foo()" found in the dll 
     Check the source of the dll for changes 
     If it has changed, attempt to compile 
     On succesfull compile, break 
    } 
    Unload DLL with FreeLibrary()/dlclose() 
} 

Теперь, кажется, работает, но я не могу не задаться вопросом, что другие методы есть? И как бы этот подход мог сравниться с использованием языка сценариев?

редактировать:https://www.youtube.com/watch?v=MOvfn1p92_8&t=10m0s

+1

Ваш вопрос немного расплывчатый.Можете ли вы сделать это более конкретным, с акцентом на фактическую проблему, которую вы пытаетесь решить? –

+0

Это довольно круто; Интересно, можете ли вы что-то сделать с компиляцией JIT 'clang'? –

+0

C: Полный справочник Schildt (или был он C++?) Имел образец проекта, который был интерпретатором C (++?). Возможно, что-то вроде этого, или включение миниатюрного, но реального компилятора с программным обеспечением. –

ответ

0

Ни С, ни С ++ требуют вперед-в-время компиляции, хотя обычные целевой среды (операционные системы, встраиваемые системы, число высокоэффективная хруст) часто большую пользу от AOT.

Вполне возможно иметь интерпретатор сценариев на C++. До тех пор, пока он придерживается поведения в Стандарте, это C++, а не «обман», как вы предлагаете.

Возможно также замена общей библиотеки, хотя для обеспечения ее работоспособности вам понадобится механизм для сериализации всего состояния и перезагрузки его в новой версии.

+0

Я думаю, что это все равно будет считаться обманом, если они обещают увеличение производительности, используя C++ вместо языка сценариев. То, что вы предлагаете, похоже на скрытый язык сценариев. – TheDespite

+0

@ TheDespite: повышенная производительность - одно из преимуществ использования широко распространенных инструментов компиляции C++. На самом деле это не язык языка. Ничто в вашем вопросе не утверждало, что они обещают хорошую работу. –

1

Да, «модификация« горячего кода »- это определенно возможность, которую многие IDE/отладчики могут иметь в той или иной степени. Вот хорошая статья:

Вот страница человек для МСВС "Изменить и продолжить":

0

от Epic Hot Reload работает за счет того, код игры, скомпилированный и загруженный как dll/.so, и затем динамически загружается движком. Повторная перезагрузка времени - это просто повторная компиляция библиотеки и перезагрузка, при сохранении и восстановлении состояния в случае необходимости.

Есть альтернативы. Вы можете взглянуть на Runtime Compiled C++ (или посмотреть RCC++ blog and videos), или, возможно, попробуйте один из других alternatives, указанный мной на wiki.

Как автор Runtime Compiled C++ Я думаю, что он имеет некоторые преимущества - его гораздо быстрее перекомпилировать, поскольку он только компилирует требуемый код, а отправной точкой может быть один exe, поэтому вам не нужно настраивать отдельный проект для dll. Однако для этого требуется некоторое обучение и немного дополнительного кода.

Смежные вопросы