有效地调用Python函数

时间:2011-07-24 15:49:01

标签: c++ python scripting boost embed

我正在将Python嵌入我的游戏中。这些脚本将用于定义角色AI,实体对游戏事件的反应等等 - 这意味着游戏中每种类型的实体都会有一个脚本。

每个脚本都有一个像createEntity()这样的函数或者会返回构造实体的东西。什么是调用这些函数的有效(ish)方法(记住,每个实体的脚本中都有一个)。

我最初的想法是做类似你在下面看到的事情,但是,我不确定这是多么有效率。例如,在运行该字符串后,导入的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`...

你有什么建议?

2 个答案:

答案 0 :(得分:1)

Ousterhout on the role of scripting languages是一个老人,但很好。对于你曾经说过要编写游戏玩法的游戏,模型(Python)已经按照你所描述的那样组织了流程。如果PyGame或类似的库不能完成呈现视图的任务,请查找或构建可以的Python模块。

换句话说,当我建议你向后集成时,听起来你要求视图反复调用模型来更新自己。我想不出一种方法,将隐喻推车放在马前会产生效率或易于发展。

答案 1 :(得分:1)

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

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

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

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

虽然我不是游戏开发人员,但我一直在寻找并且我已经看到一些情况,其中单个等效C和Python操作之间(现在)微秒的差异对于用户来说是可感知的。可感知的性能问题几乎总是由于其他因素造成的,例如磁盘I / O,网络延迟或低效的算法实现。