2011-07-24 2 views
2

Я внедряю Python в свою игру. Сценарии будут использоваться для определения символа AI, как субъекты реагируют на игровые события, и т. Д. — это означает, что в игре будет скрипт для каждого типа сущности.Эффективное вызов функции Python

Каждый скрипт будет иметь такую ​​функцию, как createEntity() или что-то, что вернет построенный объект. Что было бы эффективным (ish) способом вызова этих функций (помните, что в скрипте каждого объекта есть один).

Моя первоначальная мысль заключалась в том, чтобы сделать что-то вроде того, что вы видите ниже, однако я не уверен, насколько это эффективно. Например, что происходит с импортированным модулем героя после запуска этой строки? Остается ли он загружен в основной модуль? Если это так, это проблематично, так как я собираюсь импортировать множество скриптов для всех объектов, которые мне могут понадобиться добавить в игровой мир.

boost::python::handle<> result(
    PyRun_String("import hero\n" "createEntity()\n", 
     Py_file_input, main_namespace.ptr(), main_namespace.ptr()) 
); 

// Then extract the entity from `result`... 

Какие у вас есть предложения?

+2

Без дополнительной информации я предлагаю вам сделать это в обратном порядке. Если вы хотите определить поведение в Python, тогда напишите приложение в Python, вызывающем на C++ для машинных зависимых, быстрых действий. Внедрение Python в том виде, в котором вы предлагаете играть с ошибками обоих языков, обращая его в свои сильные стороны. – msw

+0

@msw До сих пор я предполагал, что конечный результат должен быть исполняемым (написанным на C++), который вызывает функции, определенные в Python всякий раз, когда это необходимо. Неправильно ли мое изображение? –

+0

см. Мой ответ ниже – msw

ответ

1

В вашем вопросе не указывается, важна ли эффективность пространства (т. Е. Память), эффективность по времени или эффективность труда. Просто потому, что вы рассматриваете гибридное приложение C++/Python, я полагаю, что эффективность труда является значительным фактором. Поскольку вы разрабатываете игру, я предполагаю, что будет какая-то ее часть, которая нуждается в чрезвычайно жесткой скорости выполнения.

Возможно, такой подход приведет к балансу. Сделайте все взаимодействие с пользователем (ввод и вывод, включая любую сеть) на C++, основанный на минимальной задержке. Вы можете поместить это в свою нить или процесс. Учитывая событие высокого уровня от модели, подобно перемещению персонажа, этот код очень быстро обновляет экран и сеть. Учитывая событие пользователя или событие из сети, он отправляет сообщение модели.

Игровая модель, которая может быть асинхронной для представления/управления, была бы в Python для вашего удобства, и поэтому вы можете использовать функциональное программирование и т. Д. Вы можете использовать разделяемую память или аналогичный механизм IPC между двумя и запускать их отдельно, если на самом деле внедрение интерпретатора неудобно.

Хотя некоторые приложения ИИ имеют интенсивность процессора, поэтому может возникнуть соблазн вернуться на C или C++ для них, я бы посоветовал сделать это в качестве последнего шага в ответ на явные проблемы с реагированием в интерпретируемом коде, если вы делаете это вообще. Возможно, вы захотите также следовать этой линии мышления с графикой, так как в настоящее время большая часть графической обработки делегируется видеооборудованию, если у вас есть способ сделать вызовы библиотеки, которые вам нужны из кода Python.

Хотя я не разработчик игр, я был рядом, и я видел несколько ситуаций, в которых разница в микросекундах (в настоящее время) между однократными эквивалентными операциями C и Python ощущается среди пользователей. Заметные проблемы с производительностью почти всегда связаны с другими факторами, такими как дисковый ввод-вывод, сетевая латентность или неэффективные реализации алгоритмов.

+0

Основываясь на других сообщениях опроса, кажется, что он может попытаться сгенерировать скомпилированный двоичный файл в первую очередь. Я видел такой вопрос, когда кто-то предполагает, что бинарный дистрибутив будет сложнее взломать; такие вопросы всегда предполагают гораздо меньшую мотивацию, чем, кажется, показывают игровые хакеры. – msw

+0

@msw Вы слишком далеко продвигаетесь вперед (и делаете слишком много предположений). Я просто хочу, чтобы исполняемый файл прочитал скрипты Python; безопасность находится в самом низу моих проблем - если они хотят изменить мою игру, пусть будет так. –

1

Ousterhout on the role of scripting languages является старым, но хорошим. В случае игры, в которой вы сказали, что игровой процесс должен быть сценарием, модель (Python) уже организует поток, как вы его описали. Если PyGame или подобная библиотека не справляется с задачей представления представления, найдите или создайте модуль Python, который может.

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

+0

Разве все зависит не от того, что вы хотите получить от конечного результата? Я не хочу писать игру на Python; Я хочу написать игру на C++, которая может быть написана сценарием. Другими словами, «главное» - это исполняемый файл C++, а не скрипты Python. –

+0

@Paul два не являются взаимоисключающими ... вы всегда можете запустить исполняемый C++ скрипт Python, который затем перезвонит к исполняемому файлу C++. –

+0

@Jeremy Конечно, но кто называет, кто первым важен. –

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