有效地调用Python函数

Efficiently calling a Python function

本文关键字:函数 Python 调用 有效地      更新时间:2023-10-16

我将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或类似的库不能完成呈现视图的任务,请查找或构建一个可以。

换句话说,当我建议您向后集成时,听起来像是要求视图反复调用模型以更新自身。我认为本末倒置既不能提高效率,也不能促进发展。