Unity3D逻辑热更新,第二代舒爽解决方案,L#使用简介

热更新

天下武功,无坚不破,惟快不破 html

热更新就是为了更快的把内容推到用户手中。 git

以前,我设计了C#Light,通过半年多的持续修补,勉强可用,磕磕绊绊。
感谢那些,试过,骂过,用过的朋友,在大家的陪伴下一路走来,也让我更坚决了要把这件事作好的决心。因而就有了C#Light的2.0,L#。 github

为何叫L#呢?
由于此次是直接加载解析DLL执行,Load,有一个L
由于直接执行的东西叫作IL,有一个L
由于模拟CLR的工做,有一个L
因而,就有了L# c#

https://github.com/lightszero/LSharp 性能

欢迎加QQ群223823428探讨: 测试

L#为何舒爽

上一篇已经解释了工做模式
你能够看到这一次变C#Light的"巧妙"利用VS、mono作语法检查变成真的使用vs、mono来编译
完全的解决了C#Light语法支持不完整的问题
C#Light设计之初就肯定了是c#的语法子集
编写起来,限制诸多,到处掣肘,只保留了C#的形
这一次,L#,形神兼备。并且不止是c#,L#支持C# vb.net unityscript f# boo,只要能编译成dotnet dll就能够 优化

 

上一篇见这里http://www.cnblogs.com/crazylights/p/4216913.html spa

上一篇发布以后,L#的接口又作出了一些调整 .net

Github 上有最新的源码https://github.com/lightszero/LSharp
其中有一个ForUnity目录,就是为Unity准备的
已经测试经过了IOS和WP8这两个极端环境 线程

L#在C#Light基础上作出的改进

1.C#light的Context设计不明确

不少人都在疑惑什么时候该new,为什么要new
L#完全把这个设计修改成ThreadContext,脚本中的线程管理对象,在一个线程上只须要new一次,并且随时ThreadContext.active 就可获取。
之前C#Light 从回调中调用,就只能看到回调一部分脚本堆栈了。
L#修改了这个设计,一个线程上的脚本堆栈全是一体的,即便通过回调也彻底可见,通过回调排错再也不困难

2.改动了接口结构

更像反射,方便在反射和L#脚本中快速切换
L#的接口结构和反射一致,并且能够直接使用L#的调用方式调用反射。
更添加了快速切换反射和L#脚本的模式,发生难以判断的bug时,能够切到反射模式排查。
在支持反射的平台上,也能够切换到反射模式加速
快速切换的例子,有一个独立测试程序,Test01

3.注册改成可选

C#Light采用了先注册再调用的模式,不少人抱怨不便。
这实际上是C#Light设计上的先天困难。
而IL解析DLL执行,DLL中的信息很完整,因此IL默承认以自动完成全部的类型注册
也依然保留手工注册的接口。

4.L#的神器CrossBind

L#设计了一个CrossBind方式,容许脚本直接继承程序中的接口

好比在程序中设计一个

Interface IState

{

void Abc();

}

脚本能够继承此接口,并返回兼容IState的实例给程序

脚本中已经实现了关于迭代器的两个CrossBind

也就是支持在脚本中使用yield语句。

L#的优化空间

不少人都关心L#的性能问题,L#的工做还没推动到那个阶段。

如今在Alpha阶段,欢迎小白鼠加入,一块儿踩踩坑。

根据目前的少许用户试用反馈,其Bug是比C#Light Alpha阶段少了不少的。

可是L#存在很大的优化空间

  1. 还有不少阶段有填Cache的空间
  2. 既然咱们是模拟CLR的工做,对IL语句,天然也能够作出相似JIT的优化。

    好比a.nop语句彻底是浪费时间能够移除

    b.stloc ldloc 这种两条连续,参数一致的语句,他的意义是保存变量并加载变量,咱们就能够设计一条优化指令,stlocandstayinstack,保存变量而且保留在栈上。

c.不少算术运算都是ld到栈,计算,再存回,只要设计优化的自增运算指令,就能够三条变一条

3.能够考虑 unsafe 或者本地代码的引入

相关文章
相关标签/搜索