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

热更新

天下武功,无坚不破,唯快不破

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

之前,我设计了C#Light,经过半年多的持续修补,勉强可用,磕磕绊绊。
感谢那些,试过,骂过,用过的朋友,在你们的陪伴下一路走来,也让我更坚定了要把这件事做好的决心。于是就有了C#Light的2.0,L#。

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

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

上一篇发布之后,L#的接口又做出了一些调整

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 或者本地代码的引入

时间: 2024-10-11 13:53:47

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

Unity逻辑热更新

声明:原博链接: http://blog.csdn.net/janeky/article/details/17652021只是把自己研究实践的过程记录下来 先直接上代码:两个类,一个检测资源更新,有更新则下载到本地(ResUpdate),一个是逻辑热更新(LogicUpdate)一.资源对比更新并下载.资源是否更新了是通过比对服务器与客户端的 资源版本表: version.txt该文本文档内容为: Cube.assetbundle,78a6cd06388449d16aea5f6eae395abf

Unity3D|-XLua热更新用法的大致流程

xlua是由腾讯维护的一个开源项目,我们可以在github上下载这个开源项目并查看一些相关文档 官网:https://github.com/Tencent/xLua 配置文档:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md 常见问题解答:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/faq.md 接下来我们来走一遍使用xlua的大致

unity3d 计时功能舒爽解决方案

上次也写了一篇计时功能的博客 今天这篇文章和上次的文章实现思路不一样,结果一样 上篇文章地址:http://www.cnblogs.com/shenggege/p/4251123.html 思路决定一切啊... 这次思路比上次的好很多,多谢我的好基友小全全指点 思路就是new一个时间,年月日随便写,时/分/秒/毫秒归零 为什么要归零呢? 因为在update中每执行一次,我们就向这个时间 +time.deltatime 秒 然后在分别取出分/秒/毫秒 表达能力有限,举个例子吧 2015.1.30.

Unity3D热更新全书-何谓热更新,为何热更新,如何热更新

首先来赞叹一下中文,何谓为何如何,写完才发现这三个词是如此的有规律. 为何赞叹中文?因为这是一篇针对新手程序员的文字,是一节语文课. 然后来做一下说文解字,也就是 何谓热更新 热更新,每个程序员一听就明白,但是它语出何处,究竟表达了什么含义,到底代表了什么,对技术有什么要求,对经验相对较少的程序员来说可能就有一层神秘面纱了. 热更新,是对hot update 或者 hot fix的翻译,计算机术语,表示在不停机的前提下对系统进行更改. hot 就是热,机器运行会发烫,hot就是不停机的意思. 热

Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新完全解读

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

Unity3D热更新方案网摘总结

参考:http://blog.csdn.net/guofeng526/article/details/52662994 http://blog.csdn.net/u010019717/article/details/50853207 "热更新"这个词,在Unity3D的应用下,是有些语义错误的,但是作为大家都熟知的一项技术,我们姑且这么叫它,相信很长时间内,大家依然还会这么叫,甚至有人叫它"暖更新". 一.什么是热更新? 广义定义 无需关闭服务器,不停机状态下修复漏

Unity官方公布热更新方案性能对比

孙广东  2016.3.11 Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda ?  什么是热更新 ?  为何要热更新 ?  如何在iOS 上对Unity 应用进行热更新 ?  支持Unity iOS 热更新的各种Lua 插件的对比 什么是热更新 ? 广义定义 ? 无需关闭服务器,不停机状态下修复漏洞,更新资源等,重点是更新逻辑代码. ? 狭义定义( iOS热更新) ? 无需将代码重新打包提交至AppStore,即可更新客户端的执行代码,即

Unity官方发布热更新方案性能对照

孙广东  2016.3.11 Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda ?  什么是热更新 ?  为何要热更新 ?  怎样在iOS 上对Unity 应用进行热更新 ?  支持Unity iOS 热更新的各种Lua 插件的对照 什么是热更新 ? 广义定义 ? 无需关闭server,不停机状态下修复漏洞,更新资源等,重点是更新逻辑代码. ? 狭义定义( iOS热更新) ? 无需将代码又一次打包提交至AppStore,就可以更新clien

unity3d热更新插件uLua学习整理

前言 IOS不能热更新,不是因为不能用反射,是因为System.Reflection.Assembly.Load 无法使用System.Reflection.Emit 无法使用System.CodeDom.Compiler 无法使用这三个不能用,就把传统dotnet动态路径坑死了为啥“这三个不能用,就把传统dotnet动态路径坑死了”呢动态载入dll或者cs的方法就这几个, IOS 下不能动态载入dll或者cs 文件,已经编译进去的没事.=============================