C++ 没有调用Lua OOP函数?
我用Lua和LuaBridge搭配Allegro 5。我决定将所有图形对象移植到Lua,但遇到了一些问题: 一次调用的字符类C++ 没有调用Lua OOP函数?,c++,lua,allegro5,metatable,luabridge,C++,Lua,Allegro5,Metatable,Luabridge,我用Lua和LuaBridge搭配Allegro 5。我决定将所有图形对象移植到Lua,但遇到了一些问题: 一次调用的字符类 Character = {sprite; AI} function Character:new() o = o or {} -- works! setmetatable(o, self) -- works! self.__index = self -- works! return o -- works! end function Character:
Character = {sprite; AI}
function Character:new()
o = o or {} -- works!
setmetatable(o, self) -- works!
self.__index = self -- works!
return o -- works!
end
function Character:LoadSprite(filename)
self.sprite = self.sprite or Bitmap() -- works!
self.sprite:LoadFile(filename) -- works!
self.sprite.x = 0 -- works!
self.sprite.y = 0 --works!
end
function Character:SetX(xx)
self.sprite.x = xx -- maybe? cannot tell if it works or not.
end
function Character:AddBehavior(fname, cname)
self.AI = self.AI or Pattern()
self.AI:AddBehavior(fname, cname)
end
function Character:Draw()
self.sprite:Draw() -- works!
end
Foo = Character:new()
Lua从主程序调用其函数的脚本:
function CoreInit() --called at initialization
Foo:LoadSprite("Image.png") -- works!
end
function CoreLogic() --called during logic cycle
Foo:SetX(50) -- does NOT work!
end
function CoreDraw() --called during drawing/rendering cycle
Foo:Draw() --works perfectly!
end
因此,基本上,脚本使用适当的坐标和图像初始化角色,并绘制它,但是要么没有调用逻辑(它在逻辑循环中),要么更改X坐标的函数出了问题
任务管理器还建议每个周期内存在30 kb的内存泄漏,在C++中有图像对象时不会发生。 下面是位图结构的一个片段,它是通过LuaBridge导出到Lua的,以备需要:
void Bitmap::Register(lua_State*lua) {
luabridge::getGlobalNamespace(lua)
.beginClass<Bitmap>("Bitmap")
.addConstructor <void (*) (void)> ()
.addStaticData("scale", &Bitmap::scale)
.addFunction("LoadFile", &Bitmap::LoadFile)
.addFunction("Draw", &Bitmap::Draw)
.addData("x", &Bitmap::x)
.addData("y", &Bitmap::y)
.addData("w", &Bitmap::w)
.addData("h", &Bitmap::h)
.endClass();
}
void Bitmap::LoadFile(string file) {
name = file;
bitmap = al_load_bitmap(file.c_str());
w = al_get_bitmap_width(bitmap);
h = al_get_bitmap_height(bitmap);
}
void Bitmap::Draw() {
if (scale > 1)
al_draw_scaled_bitmap(bitmap, 0, 0, w, h, x * scale , y * scale, w * scale, h * scale, 0);
else
al_draw_bitmap(bitmap, x, y, 0);
}
Bitmap::Bitmap() : velocity(1) {
bitmap = NULL;
}
Bitmap::~Bitmap() {
name = "";
if (!bitmap)
al_destroy_bitmap(bitmap);
}
在CoreLogic函数中,它将调用Foo.AI:DoBehavior(),这完全没有做任何事情,并导致内存泄漏。Foo.AI:DoBehavior()
从文件中读取一个块,为其内容、字节码转换形式、函数环境和在此文件顶层创建的任何可能的临时值保留内存。预计它将在此处丢失内存,而不是泄漏。Lua不会立即释放内存。实际上,它甚至根本不会返回到系统中
偶尔垃圾收集器会运行并查找不再使用的字符串/表/函数/任何其他内容。Lua在其自己的内部索引中将此内存标记为空闲,并在下次需要空闲内存时使用它,但从系统中看到的Lua内存消耗将永远不会减少
如果您怀疑程序的某些部分可能会在自动GC调用之间生成太多不必要的垃圾,您可能希望通过collectgarbage
或C API强制执行GC步骤。Foo.AI:DoBehavior()
从文件中读取块,为其内容、字节码转换形式保留内存,函数环境以及在此文件顶层创建的任何可能的临时值。预计它将在此处丢失内存,而不是泄漏。Lua不会立即释放内存。实际上,它甚至根本不会返回到系统中
偶尔垃圾收集器会运行并查找不再使用的字符串/表/函数/任何其他内容。Lua在其自己的内部索引中将此内存标记为空闲,并在下次需要空闲内存时使用它,但从系统中看到的Lua内存消耗将永远不会减少
如果您怀疑程序的某些部分可能会在自动GC调用之间生成太多不必要的垃圾,那么您可能希望通过
collectgarbage
或C API强制执行GC步骤。在多做一些工作之后,我就能够解决这个问题;本质上,它返回到模式表的构造函数以及AI对象是如何在字符中初始化的。我不得不将构造函数从:
Pattern = {complete; timer; command; Files; Commands; itr; num}
function Pattern:new()
o = o or {}
o.Files = {}
o.Commands = {}
o.complete = false
o.timer = 0
o.itr = 1
o.num = 1
setmetatable(o, self)
self.__index = self
return o
end
致:
这是:
Character = {sprite; AI}
function Character:new()
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
致:
现在,对Foo.AI:DoBehavior()的调用按预期进行,没有使用额外的内存。这段代码是我第一次尝试在Lua中实现OOP,这可能是我从现在开始要做的事情。在多做了一些工作之后,我能够解决这个问题;本质上,它返回到模式表的构造函数以及AI对象是如何在字符中初始化的。我不得不将构造函数从:
Pattern = {complete; timer; command; Files; Commands; itr; num}
function Pattern:new()
o = o or {}
o.Files = {}
o.Commands = {}
o.complete = false
o.timer = 0
o.itr = 1
o.num = 1
setmetatable(o, self)
self.__index = self
return o
end
致:
这是:
Character = {sprite; AI}
function Character:new()
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
致:
现在,对Foo.AI:DoBehavior()的调用按预期进行,没有使用额外的内存。这段代码是我第一次尝试在Lua中实现OOP,从现在开始我可能会这样做。内存泄漏和循环是什么意思?Lua是垃圾收集的。在您的情况下,每次调用
Bitmap()
都会创建“对象”,而不一定会销毁。如果将对象放在闭包中,则引用将被保留,因此C++绑定对象的释放将被进一步延迟。基本上,每次调用Celeloic函数(当前FPS为30)时,程序的内存占用增加了30 kb。我设法解决了AI表的一个问题。我马上发布代码。内存泄漏和循环是什么意思?Lua是垃圾收集的。在您的情况下,每次调用Bitmap()
都会创建“对象”,而不一定会销毁。如果将对象放在闭包中,则引用将被保留,因此C++绑定对象的释放将被进一步延迟。基本上,每次调用Celeloic函数(当前FPS为30)时,程序的内存占用增加了30 kb。我设法解决了AI表的一个问题。我会马上发布代码。
Character = {}
function Character:new()
local o = {sprite; AI = Pattern:new()}
setmetatable(o, self)
self.__index = self
return o
end