为什么LuaJIT会从这个简单的代码中产生“太多的回调错误”?

时间:2015-06-25 06:13:40

标签: lua chipmunk love2d luajit

我正在使用LuaJIT并使用此代码遇到“太多回调”异常。我知道可以生成的c回调数有限制,但据我所知,这应该只生成一个回调......对吗?

reverse('mhs_edit', args=("123",))

如果CALL_COUNT减少到500,则无误地运行。

例外情况如下:

ffi = require('ffi')
ffi.cdef([[typedef double cpFloat;
typedef struct cpSpace cpSpace;
typedef struct cpBody cpBody;

cpSpace* cpSpaceNew(void);
cpBody* cpBodyNew(cpFloat mass, cpFloat moment);
cpBody* cpSpaceAddBody(cpSpace *space, cpBody *body);

typedef void (*cpSpaceBodyIteratorFunc)(cpBody *body, void *data);
void cpSpaceEachBody(cpSpace *space, cpSpaceBodyIteratorFunc func, void *data);

]])

chipmunk = ffi.load("chipmunk")
space = chipmunk.cpSpaceNew()
body = chipmunk.cpBodyNew(10, 100)
chipmunk.cpSpaceAddBody(space, body)

drawBody = function(body, x) end
CALL_COUNT = 5000
for i = 1, CALL_COUNT do
  chipmunk.cpSpaceEachBody(space, drawBody, nil)
end

背景信息:我在Mac OS X上将Chipmunk与Love2D平台集成。

1 个答案:

答案 0 :(得分:3)

在LuaJIT中,C回调是一种有限的资源。见http://luajit.org/ext_ffi_semantics.html#callback

您的函数cpSpaceEachBody将函数作为第二个参数。 每次你打电话;你正在创建一个新的C函数。

除了创造太多之外;你永远不会释放它们。

您应该使用尽可能少的C函数。在您的示例中,您每次都使用相同的功能,因此这是一个简单的修复:

ffi = require('ffi')
ffi.cdef([[typedef double cpFloat;
typedef struct cpSpace cpSpace;
typedef struct cpBody cpBody;

cpSpace* cpSpaceNew(void);
cpBody* cpBodyNew(cpFloat mass, cpFloat moment);
cpBody* cpSpaceAddBody(cpSpace *space, cpBody *body);

typedef void (*cpSpaceBodyIteratorFunc)(cpBody *body, void *data);
void cpSpaceEachBody(cpSpace *space, cpSpaceBodyIteratorFunc func, void *data);

]])

chipmunk = ffi.load("chipmunk")
space = chipmunk.cpSpaceNew()
body = chipmunk.cpBodyNew(10, 100)
chipmunk.cpSpaceAddBody(space, body)

drawBody = function(body, x) end
drawBody_C_func = ffi.cast("cpSpaceBodyIteratorFunc", drawBody)
CALL_COUNT = 5000
for i = 1, CALL_COUNT do
  chipmunk.cpSpaceEachBody(space, drawBody_C_func, nil)
end
drawBody_C_func:free()