最近在学习lua,准备在下一个游戏中使用lua作为逻辑部分的开发语言。
看中两点,一个是代码不用编译,且容易实现热更新,c++的代码在工程规模大了之后,编译速度很慢,经常是改了几行代码,就要等待长达10几,甚至几十分钟的编译时间。这点对开发速度影响较大。第二,c++程序容易挂。虽然在这个项目中,做到了几乎不挂,但是这其中的对开发人员的要求太高了。基于上面两点,打算在下一个游戏中使用脚本语言作为主要的逻辑开发语言,提高效率,降低人员要求。
切入正题。
lua热更新很简单,常用的有dofile,require等方法。这里只涉及require方法
上代码:
------------------------------------------------
main.lua
------------------------------------------------
require "liba"
require "libb"
--dofile("libb.lua")
--print(package.loaded["libb"])
--print("load liba success!")
print("M> ")
while true do
line = io.read()
if line == "q" then
break
elseif line == "a" then
f = liba.a("YES")
elseif line == "b" then
f()
liba.a("NO")()
elseif line == "reload a" then
package.loaded["liba"] = nil
require "liba"
elseif line == "reload b" then
package.loaded["libb"] = nil
require "libb"
elseif line == "v" then
liba.version()
elseif line == "c" then
liba.call("&&")
elseif line == "api" then
liba.api("nono")
end
end
----------------------------------------------------------------
liba.lua
----------------------------------------------------------------
liba = {}
function liba.version()
print("1.0.3")
end
function liba.api(data)
print(data)
end
function liba.call(d)
libb.echo(d)
end
function liba.a(d)
return libb.ec(d .. " 1.0.4")
end
return liba
------------------------------------------------------------
libb.lua
------------------------------------------------------------
libb = {}
function libb.echo(d)
print(d)
print("xx" .. d .. "yy")
end
f = libb.echo("yes")
function libb.ec(d)
local function he()
print(d)
print("OK")
end
--[[
local a = d
local function ha()
print(a)
end
--]]
return he
end
return libb
需要注意一点,对于闭包函数的热更新。闭包函数中的upvalue的更新是个麻烦的问题,要么就禁止这样的写法,要么就在把所有这些函数都放入全局的列表,使用的地方引用全局列表中的项,在更新的时候,把全局表中内容修改后,再修改使用地方的引用项。这个过程还是有点麻烦的。
看中两点,一个是代码不用编译,且容易实现热更新,c++的代码在工程规模大了之后,编译速度很慢,经常是改了几行代码,就要等待长达10几,甚至几十分钟的编译时间。这点对开发速度影响较大。第二,c++程序容易挂。虽然在这个项目中,做到了几乎不挂,但是这其中的对开发人员的要求太高了。基于上面两点,打算在下一个游戏中使用脚本语言作为主要的逻辑开发语言,提高效率,降低人员要求。
切入正题。
lua热更新很简单,常用的有dofile,require等方法。这里只涉及require方法
上代码:
------------------------------------------------
main.lua
------------------------------------------------
require "liba"
require "libb"
--dofile("libb.lua")
--print(package.loaded["libb"])
--print("load liba success!")
print("M> ")
while true do
end
----------------------------------------------------------------
liba.lua
----------------------------------------------------------------
liba = {}
function liba.version()
end
function liba.api(data)
end
function liba.call(d)
end
function liba.a(d)
end
return liba
------------------------------------------------------------
libb.lua
------------------------------------------------------------
libb = {}
function libb.echo(d)
end
f = libb.echo("yes")
function libb.ec(d)
--[[
--]]
end
return libb
需要注意一点,对于闭包函数的热更新。闭包函数中的upvalue的更新是个麻烦的问题,要么就禁止这样的写法,要么就在把所有这些函数都放入全局的列表,使用的地方引用全局列表中的项,在更新的时候,把全局表中内容修改后,再修改使用地方的引用项。这个过程还是有点麻烦的。