问题背景
项目中前段时间重构,其中实现了退出游戏时游戏模块代码卸载的功能。
先说一下基础逻辑,
1 进入游戏时,将所有的游戏中用到的lua代码的路径使用一个路径表存起来。
2 退出游戏时,遍历该路径表,将所有的路径卸载。
即可达到第二次进游戏,代码重新加载,不用每次修改游戏代码都重启项目,方便调试。更重要的是多款子游戏切换时,可以卸载上一款游戏的代码内存占用。
表现,排查
但是这过程中遇到一个奇怪问题。即".""/"路径差异,导致部分代码卸载不掉。
各种角度检查代码,未发现逻辑异常。最后打印卸载路径时发现,出问题的这些文件,路径中某个分隔符是"/",其他正常文件的全部统一为"." ,于是修改测试,验证确实是"/"引起的。
后经测试,只有保持路径中全是以"/"作为分隔符,或全以"."作为分隔符才可以保证package.loaded[v] = nil正确卸载代码,不可同时使用".","/"两种分隔符。另外同时使用".","/"两种分隔符加载是没有问题的。
至于问题的底层原理,暂未在网上找到令人信服的解释,留个坑。
最后,建议
最后,建议统一使用"/"来做路径分割符。
见过Lua路径空异常的同学应该知道,lua,require的默认遍历路径都是"/"形式的。最好与官方保持统一。
另外"."分隔符在操作系统层面有很多其他的用处,比如同层级相对路径,文件后缀名分隔符,等等。所以最好不要使用".",防止引起误解,特别是不要引起操作系统的误解。