unity导表excel->lua优化

本文详述了一位开发者针对游戏中的Excel配置表转化为Lua表过程中的内存优化经验。首先,原始的lua导表采用hash存储,导致高内存占用。通过重构和提取高频配置为默认配置,内存优化约20M。接着,采用静态分表加载策略,仅在需要时加载特定部分,进一步减少内存占用至20M左右。最后,提出按需加载和分块加载的优化方案,使lua表内存管理达到理想状态。
摘要由CSDN通过智能技术生成

转自zblade - 博客园

发现一位大佬的基地,特此转载一篇做个标记,以防以后找不到了。

这是我最早而且持续时间最长的一个优化工作。在我们的游戏中,策划会有大量的配置表,全都配置在excel表中,通过编写导表工具,可以将excel表导出为对应的lua表,用于在游戏中进行lua表的加载和查找。我总结一下优化的几个节点:

        1、最初版本的导表

        最初版本的lua导表,是将excel中对应的key-value值逐一导出,其基本的格式可以表示为:

local skill = {
   {Id = 1, CD = 5, SkillTarget =1,...}    
   {Id = 2, CD = 3, SkillTarget =2,...}    
   {Id = 3, CD = 6, SkillTarget =1,...}    
}

  这种通过在table中插入多个table的方式,每个子table为hash的存储方式。仔细分析一下存储的类型,对于table而言,其基本的存储方式分为hash和array两种方式。hash的存储会有较快的读取操作,但是会带来更多的内存占用,因为其需要申请内存来存储key值,不单单只存储value值。对于array的存储方式,lua在底层的实现的时候,并不是我们常见的采用2的幂次的大小来存储,也就是,不是采用2,4,8,16,32...这种大小的存储,而是实际的根据数组的大小来分配对应的大小数组。这是后面一次优化中,通过实现设置对应大小的数组来分配内存,发现对比并没有对应的优化,后来查看源码才发现其数组的分配规则。

       最初版本的所有lua导出表都采用hash的存储方式,那么可以想象有多大的内存占用~大概在50M左右~这是一个非常可怕的内存占用,如果在游戏加载的过程中,需要加载这么大的配置表,那么游戏加载会有多缓慢,可以体会一下 :D

      2、初次优化的导表

       其实,最开始引起我们关注的并不是其存储方式,而是策划配置的某些excel表过于巨大,某些单一的表就会大到几M的数量级,分析其中的数据,很多数据并不是反复分散变化的,而是集中在较多的几个高频中,这就引申出一种优化的策略:提取高频的配置作为默认配置,少数低频的配置采用对应的配置,这样就可以得到对应的一个内存优化。具体的优化策略可以详见我的这篇文章:table重构index方法优化内存http://www.cnblogs.com/zblade/

       这篇文章的基本思想,就是通过重构和提前高频的方法,缓存高频,每次查找的时候,默认去高频中查找,如果没有,则走自身的查找。可以查看文章中的对比存储方法,写的比较详细。

    采用这种优化方法后,整体的lua导出表得到大大的优化,整体缩减了接近20M左右,可见我们的策划有多喜欢配置同样的配置 Orz

      3、进一步的优化导表

    通过上面的一次优化后,我们大大的优化了游戏的lua表内存占用,整体游戏在加载的时候,lua表统计的内存占用在30M左右。如果我们只满足于这一点,那么就不会有下一步的优化了。后续在第二次的优化上,我还进行了一些特定的优化,但是都没有太过于亮眼的优化,包括前面提到的用array的方式代替hash存储,也研究过设置array的大小,不采用2的幂次大小分配内存,事实的统计显示其实lua本身的内存分配就是采用 按需分配的,不会过多的分配内存。

    最好的优化方法,就是多和别人交流,这是我对自己优化的一个另类总结吧。在上一次的优化后,都没有太大的性能提升,但是这部分的内存占用又一直处于一个比较大的部分,后来在和其他项目组交流的时候,提供了一种静态加载的实现思路。对于lua导出表,可以用一种静态分表加载的方式。特别是对于占用内存比较大的一些表(具体每个表的占用可以做一个内存统计排序),可以分开成多份,这样在最初的游戏加载的时候,加载的是头文件部分,这部分是不包含具体的配置表信息的,具体的配置表信息存放在分表文件夹中。在实际使用的时候,比如将技能表分为part1-20,每个分表大小100,定位要获取id为1001的技能的配置,这时候去加载其对应的分表part11, 加载进来后定位取到1001的技能配置,这样就不会多余的加载part12-20这部分的数据表。

     通过静态分表加载的方式,游戏在最初加载lua表的时候,对于分表实现的lua表大大降低了游戏的内存占用,效率提升非常明显,内存占用缩小到20M左右=。=

       基于这样的实现方式,进一步分析,其实这些lua表并不需要在游戏启动的时候加载,只需要在每次第一次使用相关表的时候加载,再加载进来,同时对于大的内存表进行分块加载,综合这样的实现方式,对lua表的优化最终达到一个可以接受的地步。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值