c++ - 高效地调用 Python 函数

标签 c++ python scripting boost embed

我正在将 Python 嵌入到我的游戏中。这些脚本将用于定义角色 AI、实体如何对游戏事件使用react等——这意味着游戏中的每种类型的实体都会有一个脚本。

每个脚本都有一个函数,如 createEntity() 或返回构造实体的函数。调用这些函数的有效(大概)方式是什么(请记住,每个实体的脚本中都有一个)。

我最初的想法是像您在下面看到的那样做一些事情,但是,我不确定这样做的效率如何。例如,在我运行该字符串后导入的 hero 模块会发生什么?它是否仍然加载在主模块中?如果是这样的话,那就有问题了,因为我要为我可能需要添加到游戏世界的所有实体导入大量脚本。

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`...

你有什么建议?

最佳答案

您的问题没有具体说明空间效率(即内存)、时间效率或劳动效率对您来说最重要。仅仅因为您正在考虑混合 C++/Python 应用程序,我认为劳动效率是一个重要因素。因为您正在开发一款游戏,所以我假设其中的某些部分需要非常严格的执行速度。

也许这种方法会取得平衡。使所有用户交互(输入和输出,包括任何网络)都基于 C++,以实现最小延迟。您可以将它放在它自己的线程或进程中。给定来自模型的高级事件,例如角色移动,此代码会非常快速地更新屏幕和网络。给定用户事件或来自网络的事件,它会向模型发送消息。

为了您的方便,可以异步于 View /控件的游戏模型将在 Python 中,因此您可以利用函数式编程等。您可以在两者之间使用共享内存或类似的 IPC 机制,如果实际上嵌入解释器不方便,请单独启动它们。

虽然某些 AI 应用程序是 CPU 密集型的,因此可能很想为它们返回 C 或 C++,但我建议将其作为最后一步,以响应解释代码中明显的响应问题,如果您做到这一点。您甚至可能还想在图形方面遵循这种思路,因为现在大多数图形处理都委托(delegate)给了视频硬件,如果您有办法从 Python 代码调用所需的库。

虽然我不是游戏开发者,但我一直在身边,并且我见过很少的情况,在这种情况下,单个等效的 C 和 Python 操作之间的(现在)微秒差异对用户来说是可察觉的。可察觉的性能问题几乎总是由其他因素引起的,例如磁盘 I/O、网络延迟或算法实现效率低下。

关于c++ - 高效地调用 Python 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6807833/

相关文章:

c++ - 获取成员的类型

c++ - 在 C++ 中处理不同数组维度和数据类型的模板函数

python - 四舍五入到最接近的 500,Python

计算列表内成对点积的 Pythonic 方法

c# - 限制在 MS 脚本引擎中使用命名空间

linux - 如何在 bash 中通过 ssh 将命令输出保存到变量中

c++ - 模板函数指针参数与构造函数参数

c++ - const char指针模板特化

python - 在 Pandas 中使用 TQDM 进度条

java - 有没有用Java实现的语言?