lua依赖关系图谱

在游戏的业务逻辑比较复杂时,很容易发生依赖关系抽象错误的情况,最严重的就是发生循环引用。

error loading module 'logic.mission.handle' from file './src/logic/mission/handle.lua':
        ./src/logic/mission/handle.lua:682: too many C levels (limit is 200) in function at line 670 near 'target'

在项目中如何及时发现依赖关系的问题?我认为输出lua依赖关系图谱是一个办法。

在github上找了找,发现一个输出lua依赖关系的开源项目 [depgraph](https://github.com/mpeterv/depgraph)。阅读其源码,发现是通过 luacheck 的词法分析组件lexer寻找依赖关系,然后将依赖关系输出成dot格式文件,再通过graphviz库转化成为svg或者png依赖关系图。

由于项目中逻辑与数据分离,可以很方便的直接对存放所有业务逻辑的文件夹进行依赖关系图谱输出。

luadepgraph -m logic --dot | dot -Tsvg -o deps.svg

输出结果:

lua依赖关系图谱_第1张图片

可以发现 输出的依赖关系图十分杂乱,看都看不清,更不用说要理清楚依赖关系,然后发现问题了。

研究如何将依赖关系图谱更清晰的输出。手段是减少不必要节点和优化排版。

  • 研究了一下graphviz库,它输出的图形的排版是自动的,可以通过配置一些规则进行间接控制排版。试验下来最佳的排版方式是circo
  • 从杂乱的图可以看出,外部依赖 比如rand,target_model 根本没必要在依赖关系中画出,可以删除,减少杂乱程度
  • 依赖关系 分为以下几种 1. 只依赖其它逻辑 2. 只被其它逻辑依赖 3. 既依赖其它逻辑 ,又被其它逻辑依赖 4. 既不依赖其它逻辑,又不被其它逻辑依赖。其中第1种可以单独绘制,第2、3、4种合并绘制。

通过修改depgraph代码,将依赖关系图按照如上需求进行输出。

合并绘制图:
lua依赖关系图谱_第2张图片
处理后,依赖关系图变得相对清晰,可以用来排查依赖抽象问题。

你可能感兴趣的:(服务器开发,lua,后端,游戏开发)