-
Notifications
You must be signed in to change notification settings - Fork 202
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
优化lua方法的调用方式 #210
Comments
#31 有人提到过,里面有详细的描述。 这种处理方式就算会实现,优先级也很低,可能会加入额外的编译参数来支持。 |
准备编译成lua的C#源码:
|
|
优化后(保留函数名注释):
|
|
嗯,看起来确实可行 TypeScript 也没有做任何影响可读性的优化,CSharp.lua 初衷也是这样的,在不影响可读性的前提下,尽量的优化一些。在处理metadata时,我尝试过将__metadata__里面引用到的类型信息,都放到一张表里面导出到manifest.lua中,最终也是通过数组下标索引这些类型信息,发展确实对可读性影响较大,所以还是放弃了。 我也测试过查表和数组下标访问的效率差异,发现在jit和非jit的情况下,大致都可节约50%左右的时间,一方面确实有较大改善的空间,但是也看的出来lua查表确实也很快,并没有数量级的差异。 很多类似调用方式、函数内敛的优化可能是虚拟机层面更应该考虑的,luajit做的就很不错,如果可能的话就尽量使用luajit。 |
js的混淆,是为了混淆而混淆,lua里这里优化是为了性能而优化。 |
另外,50%的性能提升,是非常可观的了。值得为此去写一大箩筐代码。 |
是的,确实是客观的提升 |
我这边做的是FPS游戏,lua里有很多运算密集型的逻辑,已经不得不把大量逻辑改回在C#运行。但性能问题仍然很严峻,一帧耗时动不动就超过30ms |
你说过目前使用的是lua 5.3, 可以考虑在嵌入个luajit运行主逻辑,跑跑看看,这个优化就算做了,也不确定能起到很大的帮助,而且确实需要一大箩筐的代码,目前精力也有限,欢迎提交PR。 |
嗯嗯,这会也在考虑用luajit来进一步优化。等版本档期不那么紧的时候,深入学下下CSharp.lua的源码。 |
现在生成的代码调用方式分几种:
1、静态方法
2、成员方法
3、属性方法
4、运算符方法
调用方式又分为:虚方法/属性、抽象方法/属性、接口实现方法、new覆盖方法等等
而这些调用,都免不了要通过lua的table hash查找的方式来找到具体的成员,这个过程是可以优化的。
我这边使用过这种方法来优化DLL中导出的所有方法调用:
1、使用一张全局表,来通过顺序数字下标来保存所有需要被调用的方法function
例如: GlobalMethodCache = {UnityEngine.GameObject.AddComponent , UnityEngine.GameObject.GetComponent}
2、在meta.xml中,通过Template对这些方法调用,统一改成下标索引调用,即:
local gameObject;
gameObject:AddComponent(xxx)
gameObject:GetComponent(xxx)
优化成
local GlobalMethodCache;
local gameObject;
GlobalMethodCache[1](gameObject, xxx)
GlobalMethodCache[2](gameObject, xxx)
3、通过这种方式,对于没有被new覆盖的函数,没有虚函数抽象函数可以通过这种方法能避免元表找方法等额外消耗,全部优化成一个upvalue获取(GlobalMethodCache)以及一个数组下表索引,从而达到最大性能优化,同时额外的好处是还做了代码混淆。
4、对于DLL的方法调用,例如Vector3等频繁调用,可以有大概1/3的性能提升
5、对于CSharp.lua生成的代码,假如所有代码,都通过这种方式优化,相信可以得到可观的提高。
The text was updated successfully, but these errors were encountered: