有效地调用Python函数
Efficiently calling a Python function
我将Python嵌入到我的游戏中。脚本将用于定义角色AI,实体如何对游戏事件做出反应等。这意味着游戏中每种类型的实体都有一个脚本。
每个脚本都有一个函数,如createEntity()
或其他将返回构造实体的函数。调用这些函数的有效方法(记住,每个实体的脚本中都有一个)是什么?
我最初的想法是做如下所示的事情,然而,我不确定这样做的效率如何。例如,在我运行这个字符串之后,导入的hero模块会发生什么?它是否仍然加载在主模块中?如果是这种情况,那就有问题了,因为我要为我可能需要添加到游戏世界中的所有实体导入大量脚本。
boost::python::handle<> result(
PyRun_String("import heron" "createEntity()n",
Py_file_input, main_namespace.ptr(), main_namespace.ptr())
);
// Then extract the entity from `result`...
你有什么建议?
您的问题并没有说明对您来说,空间效率(即内存)、时间效率还是劳动效率是最重要的。仅仅因为您考虑的是c++/Python混合应用程序,所以我认为劳动效率是一个重要因素。因为你正在开发一款游戏,所以我认为它的某些部分需要非常严格的执行速度。
也许这种方法会取得平衡。使所有用户交互(输入和输出,包括任何网络)基于c++,以实现最小的延迟。您可以将它放在它自己的线程或进程中。给定来自模型的高级事件,如角色移动,此代码非常快速地更新屏幕和网络。给定一个用户事件,或者一个来自网络的事件,它会向模型发送一条消息。
游戏模型,它可以异步到视图/控件,然后将在Python中方便您,因此您可以利用函数式编程等。如果实际嵌入解释器不方便,您可以在两者之间使用共享内存或类似的IPC机制,并分别启动它们。
虽然某些AI应用程序是cpu密集型的,因此它可能很容易回到C或c++,但我建议将其作为最后一步,以响应解释代码中的明确响应问题,如果你真的这样做的话。如果你有办法从Python代码中调用你需要的库,你甚至可能想要在图形上也遵循这条思路,因为现在大多数图形处理都委托给了视频硬件。
虽然我不是游戏开发人员,但我已经看到了一些情况,即用户可以感知到单个等效C和Python操作之间的微秒差异(现在)。可察觉的性能问题几乎总是由其他因素引起的,比如磁盘I/O、网络延迟或低效的算法实现。
关于脚本语言的作用的讨论是老生常谈了。在你说游戏玩法是脚本化的游戏中,模型(Python)已经按照你所描述的方式组织了流程。如果PyGame或类似的库不能完成呈现视图的任务,请查找或构建一个可以。
换句话说,当我建议您向后集成时,听起来像是要求视图反复调用模型以更新自身。我认为本末倒置既不能提高效率,也不能促进发展。
- 从python中调用C++函数并获取返回值
- 从python调用openMP共享库时,未定义opnMP函数
- 有没有一个 c++ gmp 库函数与 python gmpy2 库 divm(..) 函数相同?
- C++中是否有任何函数等同于python中字典的get函数?
- 如何将 c++ get 函数代码转换为 opencv 算法中使用的 python
- 是否可以使用 libclang python 解析 cpp 文件中没有标头的函数原型
- 创建一个函数的 Python 绑定,返回指向带有 boost 的向量的指针
- 使用C++指针调用 python 函数
- 如何将 Python 字符串传递给 C++ (extern C) 函数
- 如何通过python方法和kwargs来提升python的c++函数和调用
- C++ python 中的函数返回数字而不是字符串
- 通过Cython对Python的基本C++函数
- 你如何决定将C++和/或 python 中的成员函数表示为静态?
- 使用 pybind11 调用 Python 函数时避免复制输入数据
- 从python调用C++函数,使用cython,使用cythonize
- 从 C++ 函数与 Python 函数返回的不一致值用于偏斜正态分布
- 在C++中实现类似 python "map"函数的问题:调用类成员函数
- Python 的 exec() 函数的 C++ 版本
- 如何使用 pybind11 将 python 函数保存到静态 c++ 容器中?
- 在 cpp 中嵌入 python:如何获取指向 python 函数(而不是 PyObject)的 C 指针?