2015-06-25 28 views
3

我正在使用LuaJIT,並且運行這個代碼時出現了「太多的回調」異常。我知道可以生成的c回調數量有限制,但據我所知,這應該只會產生一個回調...對嗎?爲什麼LuaJIT會從這個簡單的代碼中產生「太多的回調錯誤」?

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' 

語境:我整合與花栗鼠Mac OS X上

回答

3

的Love2D平臺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() 
+0

謝謝 - 鑄造伎倆! –

相關問題