为什么LuaJIT会生产“a”;太多回调错误“;从这个简单的代码?
我正在使用LuaJIT,并在代码中遇到“太多回调”异常。我知道可以生成的c回调的数量是有限制的,但据我所知,这应该只生成一个回调。。。对吧?为什么LuaJIT会生产“a”;太多回调错误“;从这个简单的代码?,lua,chipmunk,love2d,luajit,Lua,Chipmunk,Love2d,Luajit,我正在使用LuaJIT,并在代码中遇到“太多回调”异常。我知道可以生成的c回调的数量是有限制的,但据我所知,这应该只生成一个回调。。。对吧? ffi = require('ffi') ffi.cdef([[typedef double cpFloat; typedef struct cpSpace cpSpace; typedef struct cpBody cpBody; cpSpace* cpSpaceNew(void); cpBody* cpBodyNew(cpFloat mass, 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
CALL_COUNT = 5000
for i = 1, CALL_COUNT do
chipmunk.cpSpaceEachBody(space, drawBody, nil)
end
如果CALL_COUNT减少到500,它将正常工作
例外情况如下:
Error: main.lua:25: too many callbacks
stack traceback:
[C]: in function 'cpSpaceEachBody'
mainmoon.lua:25: in main chunk
[C]: in function 'require'
main.lua:1: in main chunk
[C]: in function 'require'
[string "boot.lua"]:374: in function <[string "boot.lua"]:244>
[C]: in function 'xpcall'
错误:main.lua:25:回调太多
堆栈回溯:
[C] :在功能“cpSpaceEachBody”中
主月亮。lua:25:在主块中
[C] :在函数“require”中
lua:1:在主块中
[C] :在函数“require”中
[字符串“boot.lua”]:374:在函数中
[C] :在函数“xpcall”中
上下文:我正在将花栗鼠与Mac OS X上的Love2D平台集成。在LuaJIT中,C回调是一种有限的资源。看 函数
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()