Я хотел бы добавить возможности сценариев для моего игрового движка C ++.
я имею Engine.exe
, Physics.dll
, Audio.dll
и я добавляю Scripting.dll
который является оберткой для ракеток высокого уровня.
Engine.exe
грузы Physics.dll
и настраивает физику мира, загружает Audio.dll
и настраивает аудио мир. Предполагается загрузить Scripting.dll
, чтобы установить привязки к Physics.dll
, Audio.dll
и загрузить игровые скрипты.
AFAIK Есть два возможных способа встраивания Racket в программу C ++:
С помощью Внешний интерфейс кажется странным из-за необходимости загрузки Physics.dll
, Audio.dll
два раза: сначала из Engine.exe
а потом из игрового скрипта.
Пишу расширения выглядит более привлекательным, потому что позволяет делать привязки скриптов на стороне C ++. С другой стороны, вы должны построить свое расширение с raco ctool
, связать это с mzdyn
объектный файл — который также выглядит неловко: почему бы не сделать mzdyn
статическая библиотека?
Я хотел бы реализовать один метод, например, setupScriptBindings()
, оба в Physics.dll
И в Audio.dll
и позвонить из Engine.exe
при запуске.
Есть ли простой способ сделать это?
Используя методы расширения и FFI для соединения Racket с кодом C, я должен сказать, что подход FFI много лучше. Привязки в Racket к функциям C хорошо определены и надежны, а иметь дело с типами C в Racket очень приятно. Единственным недостатком использования подхода FFI является то, что, AFAIK, ваша программа Racket должна быть приложением драйвера.
С подходом встраивания ваш исполняемый файл C / C ++ является драйвером, но объявление интерфейса с кодом Racket намного более ручное и подвержено ошибкам. Не говоря уже о том, что вы должны либо выяснить raco ctool и скопировать его, либо взять систему сборки ракетки на себя. Для наших целей мы извлекли источники Ракетки и создали его сами. Я не очень рекомендую такой подход.
В конечном счете, для моих целей мое приложение должно быть приложением Racket с чужим файлом .DLL / .so, которое оно загружало для функций C, работало лучше всего, но, похоже, вы застряли с подходом встраивания.
Других решений пока нет …