- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在将 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语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!