Dorothy模块管理

  在Dorothy Lua中,如果要使用某一个模块比如CCNode模块,标准的写法是在.lua的源文件开头添加local CCNode = require("CCNode"),之后就可以任意使用这个模块。
  这样做的好处很多,在动态语言里比如lua、js和python中,都会告诉你使用局部变量比全局变量要快很多。其实大概原因都是全局变量往往要从某个全局变量字典中做一次字符串哈希查找,而局部变量往往可以通过编译器优化,访问局部变量优化成在一个数组中通过index取值。当有频繁的操作时,当然访问数组要比访问哈希字典要快一些了。
  所以Dorothy为了提高一点点的性能,把所有的Lua binding导入的模块,全部放在了package.loaded这个表里,所以可以通过require函数取出来放到局部变量中使用。如果嫌取出要用的模块很麻烦,有时只是写一点测试代码的话,可以在lua源文件的最开始添加一句话:

Dorothy()

  这样就可以把所有Dorothy的Lua模块全部导入当前源文件范围内,代码执行的环境下。在这之后就可以任意地使用任何模块了,当然也要付出访问全局变量消耗的代价了。
  最后还提供一个窍门哦,如果又想提高性能,又不想手动添加模块的导入代码,也有办法。使用Dorothy框架/tools/zbstudio/下的ZeroBrane Studio编辑器来写你的lua代码,任意使用需要的模块,然后在Windows下按下Shift+F7,或是在Mac下按Fn+Shift+F7,执行代码分析完成后,就会在输出面板中自动生成模块的导入代码,再手动复制粘贴一下就可以了。

编写自己的lua模块

  Lua官方推荐的模块写法如下,编写的模块为SomeModule.lua,模块在main.lua中使用:

-- SomeModule.lua
-- 定义模块

local module =
{
	func = function(self)
    	print("Invoke module func")
    end,
    variable = 124,
}

return module
-- main.lua
-- 使用模块

local SomeModule = require("SomeModule")

SomeModule:func()
print(SomeModule.variable)

  这种模块的写法稍微要注意的事情就是require函数会执行一次模块代码,然后把模块返回的内容缓存到package.loaded表中,如果没有返回的内容则设置该模块字段为true避免重复加载。如果有缓存的内容了,以后再次require该模块的时候就不再执行模块代码,直接返回缓存的内容,如果没有缓存的内容,就不再做什么事。如果不再使用某一模块的话,一定要把package.loaded中缓存的内容清除掉以防止内存泄漏。

标题目录