XLua优化

已经从上海回北京一个星期了,也都已经忙好安顿了下来,回想了一下项目后期的一些优化举措,现在写出来,留个念想

这是我很少见的没有代码的博客吧,或许以后会更多

--------------------------------------------不---------割-----------------------------------------------------------------------------

1,给table添加元素时,tab[#tab+1]=a比table.insert(tab,a)效率高,远比table.insert(tab,1,a)效率高
2,在循环内创建变量和循环外创建变量的效率取决于创建代价和跨域代价的对比,一般情况根据经验选择
3,以局部变量代替多次使用的外部变量(xx.xx之类)
4,减少函数调用可以很大的提高效率,但会降低代码的可读性,根据经验选择
5,提前声明table大小可以很大提高效率,尽量做到!
6,string.format比…效率低,但可读性会很高,个人感觉没必要,对我来说都一样
7,在大字符串连接中,尽量避免…,用table来模拟buffer,然后用contact来获得最终字符串
8,判断数组表是否为空时,一般情况用#tab>0就行,如果tab长度特别大,用next(tab)的效率才更高
9,3R原则:
(Reducing):避免创建新对象和节约内存,如果程序中用了太多的表,可以考虑换一种数据结构
(Reusing)如果无法避免创建新对象,则需要考虑重用旧对象
(Recyling)Lua的垃圾回收机制是一个增量运行的机制,也就是说回收分为许多小步骤(增量的)来运行,.频繁的垃圾回收可能会降低程序的运行效率,可以通过Lua的collectgarbage函数来控制垃圾回收
10,能用local的尽量用local,能写在同一脚本内部的变量,尽量不跨脚本调用,单一职责原则

常见泄露:C#代理
一般情况下遇得到的比较多的泄露就是C#代理,如果把Lua函数注册给C#的代理,name这个Lua匿名函数将不能正确的被LuaGC了,也就是泄露了,改进方法就是不把Lua匿名函数注册给C#代理,这样的话,每一段时间C#都会主动Dispose.

常住内存优化:(消除配置文件中冗余数据,达到压缩和优化数据存储)
Lua作为一个极为精简的嵌入型脚本语言,一般用来实现游戏的上层业务逻辑,或者借助其本身的灵活简单的数据表达能力来用于存储(配置文件).
配置文件一般由程序员提供的导出工具来给策划进行维护(嘿嘿嘿,反正我是这么干的,让他们烦恼去吧),然后把Excel的表格数据导出为游戏可以直接读取的Lua源码.这些源码文件以Lua table的形式存储与Excel等价的数据一般来说类似二维数组或者字典的概念,一个Key对应一组子数据,如果配置文件的数据过大,或者有哦荣誉的无用户数,name就会严重的影响加载速度和增大内存占用量.
一般来说大量的重复数据或者待变没有意义的空值,大量的中文字符串需要后期本地处理的,很多复合型数据内容是一样的,针对于上面一句话制定方案:对于Excel中的一列,出现次数最多的值认定为默认值,然后把它从Lua表中剔除掉,然后利用Metable机制实现全局默认值存储.对于中文字符串,替换为一个唯一的ID表示,写回到Lua表中,读取的时候加上相应的查找替换.对于一些复杂的字标或者数组,左为宜华替换处理,替换后协会到原始数据中.,这些坐的都是唯一化处理,所以对Lua标的要求必须是可读的.因为多出引用的字标已经被替换成为一个变量,这些变量是一local
的形式存储在作用域的,由于Lua本身的限制,一个作用域内能存放的最大local变量的个数是200个,所以超过的部分会被放入一个临时数组中,初始化的时候需要额外的查表,可能会多一些开销,但目前可以接受.
一般来说配置表文件优化后,只有不到之前的一半大小了,可以极大地提高加载时间和内存占用.

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用XLua可以在Unity中实现Lua脚本的编写,同时也可以让Lua脚本与C#代码进行交互。 以下是基本的使用步骤: 1. 下载XLua插件并导入到Unity中。 2. 在Unity中创建一个新的Lua文件,编写Lua脚本代码。 3. 在C#代码中使用XLua的API来加载并运行Lua脚本,例如: ``` using XLua; public class LuaManager : MonoBehaviour { private LuaEnv luaEnv; void Awake() { luaEnv = new LuaEnv(); luaEnv.DoString("require 'main'"); // 加载并执行Lua脚本 } void Update() { luaEnv.Tick(); // 更新Lua环境 } void OnDestroy() { luaEnv.Dispose(); // 释放Lua环境 } } ``` 在上面的例子中,`Awake()`方法中创建了一个Lua环境,然后通过`DoString()`方法加载并执行了Lua脚本。`Update()`方法中每帧都调用了`Tick()`方法来更新Lua环境,`OnDestroy()`方法中释放了Lua环境。需要注意的是,在实际的项目中,可能需要更加复杂的逻辑和管理方式来处理Lua脚本的加载和运行。 4. 在Lua脚本中使用XLua提供的API来调用C#代码或者导出Lua模块,例如: ``` -- 导出一个Lua模块 local module = {} module.foo = function() print("Hello from Lua!") end return module -- 调用C#代码 local gameObject = CS.UnityEngine.GameObject("LuaObject") local transform = gameObject.transform transform.position = CS.UnityEngine.Vector3(1, 2, 3) ``` 在上面的例子中,导出了一个名为`module`的Lua模块,并定义了其中的一个函数`foo()`。同时,也调用了C#代码的API来创建了一个新的GameObject,并修改了它的Transform组件的位置。 XLua还提供了其他的功能,例如自定义导出规则、GC优化等。在使用XLua之前,建议先了解一些基本的Lua语法和C#与Lua交互的机制,以便更好地使用XLua
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值