2013-10-15 110 views
2

我目前正在一個遊戲項目中,並且必須將Lua整合到遊戲引擎中,以將遊戲對象和組件的界面暴露給腳本用戶。Lua C++類綁定垃圾收集關

我試圖研究如何將C++類對象綁定到Lua,並且我發現大多數文檔解釋瞭如何使用userdata類型來完成它。然而,我們的項目自己管理遊戲對象(這意味着我們決定何時刪除,創建遊戲對象),我不知道是否可以禁用Lua的垃圾回收。具體來說,我可以嘗試用metatable替換__gc爲零還是不起作用的函數?

我的補償是使用包含lightuserdata(this指針)的表和靜態函數來檢索「this指針」並手動調用成員函數。但是,由於程序員應該手動進行封裝靜態功能,因此很快就會變得很髒並且很難管理。

我可以獲得一些鏈接,以獲得正確使用的良好文檔或針對類似問題的解決方案嗎?

回答

3

如果你的遊戲對象是由你的遊戲引擎管理的,那就讓你的Lua用戶數據對象成爲遊戲對象的普通指針,這樣Lua的GC只會收集它們,而不是實際的對象。

如果你想讓你的對象的生命週期由Lua和C++來管理,你可以例如使用std::shared_ptr到你的對象,並讓Lua用戶數據也保存這樣一個智能指針,這樣兩個世界都可以運行相同的引用計數器,即使在Lua管理指針的情況下還會有一些額外的「內容」。

+0

謝謝你的迴應。 然而,我並沒有完全明白讓lua userdata成爲普通指針。 1.與此有什麼特別的區別和使用lightuserdata? 2.它如何有益? – user2883715

+0

@ user2883715 userdata和light userdata之間的一個主要區別是,只有userdata對象具有每個對象元表;這是因爲輕量級用戶數據基本上就像一個數字,只有'void *'而不是'double'(或者任何您配置爲數字數據類型的數據)。這就是爲什麼當你需要每個對象的元表時,你需要使用userdata而不是light userdata。然後你應用另一級間接尋常的原則 - 如果你想用指針或智能指針的userdata,那就是你堅持的原則...... –

0

LuaBridge文檔同時描述了您的問題可以如何解決,並提供了一個開箱即用的解決方案 - LuaBridge。你不需要推出自己的。還有一些其他綁定庫也可以考慮。