Эффективно вызывая функцию Python - PullRequest
2 голосов
/ 24 июля 2011

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

Каждый скрипт будет иметь функцию типа 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 ]

1 голос
/ 26 июля 2011

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

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

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

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

1 голос
/ 24 июля 2011

Ousterhout о роли языков сценариев старое, но положительное.В случае игры, где вы сказали, что игровой процесс должен быть написан по сценарию, модель (Python) уже организует поток, как вы его описали.Если PyGame или подобная библиотека не в состоянии представить представление, найдите или создайте модуль Python, который может.

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

...