我在 Python C API 上有点挣扎。我正在调用 python 方法以大约 60hz 进行一些游戏 AI。它大部分时间都可以工作,但每隔一秒左右,对 PyEval_CallObject 的调用就会产生一个 NULL 返回值。如果我正确检测到错误并继续循环,那么下一秒左右一切都会好起来,于是错误再次发生。
我怀疑我在引用计数方面做错了什么,但我无法弄清楚它是什么:
int script_do_ai(struct game_data_t* gd)
{
PyObject *pAiModule, *pResult;
float result=0.0;
pResult = NULL;
pAiModule = PyImport_Import(PyString_FromString("ai_script"));
Run Code Online (Sandbox Code Playgroud)
是的,我每次迭代都会导入模块。那有必要吗?如果我将 pAiModule 存储为全局变量,大约一秒钟后就会发生严重崩溃。
pResult = PyEval_CallObject(PyObject_GetAttrString(pAiModule, "do_ai"),
Py_BuildValue("f", gd->important_float))
if (pResult != NULL)
{
PyArg_Parse(pResult, "f", &result);
Py_DECREF(pResult);
ConquerEnemies(result); //you get the idea
}
else //this happens every 75 or so iterations thru the loop
{
if (PyErr_ExceptionMatches(PyExc_SomeException)) //? not sure what to do here
{
Run Code Online (Sandbox Code Playgroud)
我还没有找到如何提取异常,或者......没有对 …