今天周五 ,明天没有什么事情,可以安心写一些博客。
今天聊 两个话题
一 , unity热更新的窘境
二 ,我所使用的unity 热更新方案JSB
======================================热更新的窘境=============================================
(1)其实unity 热更新到瓶颈是 ios 的 系统本身 ,禁止你 jit 。说白了,内存中代码,系统本身不让你执行。
安卓 系统,桌面 系统,本身都支持 动态直接替换dll, 热更新方案 相对较多 一些,我这就不一一列举啦。
我自己觉得,在ios 跑不起来的热更新方案 ,都是不过关的热更新方案,(不服你来打我啊).
=========================== lua============================
现在国内比较流行的 unity 更新方案是lua(ulua http://www.ulua.org/ 和slua http://www.slua.net/), 为什么我只说这两个呢,以为 其他的lua 解决方案,比如
unilua (https://github.com/xebecnan/UniLua 云峰大神的c# 实现) ,效率 上比不上 前面两个(执行引擎用c# 来写,你觉得会快过c 写的吗?况且前面两位都是静态绑定,可以完全没有反射,效率不言而喻)目之所及 是在逐渐的淡出;另外 还有 moon http://www.moonsharp.org/也是 c#的lua 实现,效率 问题令人堪忧(不过作者 很有爱,我很喜欢)。
================================L#=============================
说到 热更新,你还不能不提起 李总的 L# ,真的是奇思妙想的 杰作,(L# 的第一个版本,李总 http://www.cnblogs.com/crazylights 也就用了2天就完成了,大神就是大神),L# 直接内置 c# 版本 dll 的虚拟机。但是有些问题 还靠反射,这在ios 的il2cpp 的 有各种各样的风险。而且效率本身受到 c# 本身语言的限制,是有瓶颈的。我坦然的说 L# 没有ulua 和slua快(不服照样来打我)
==================================JSB=======================
(2)最后,我开始介绍我使用JSB,这里是JSB作者的博客 http://www.cnblogs.com/answerwinner/p/4469021.html。它的骨架是 你离线的 c# 代码,通过sharpkit(一个c# 转js的工具),转成js 脚本,这些js 脚本中 ,会绑定一些你的unity的内部类,然后把这些脚本放到 spidermokey 里面执行,总体来说,你完全可以只写c# 就可以完全离线更新逻辑。我说一下我为什么要选择 JSB
原因一,我不想精通第二门语言。我们做游戏客户端的需要懂得东西很多,你搞unity ,熟悉c# 就可以啦,如果你还要把精力放在 学习lua 和 js 上面的话,你把两门语言都用熟的时间,为什么不用来学习 3d 图形学,渲染,shader呢,我的精力是有限的,我不是超人。我不想精通第二们语言( 其实,我本人 java oc lua js php 一般简单的代码是没有问题的,也对一些新兴起来的语言比如 rust go 等 怀有很高的兴趣),只是说 术业有专攻而已
原因二,效率问题。坦率的讲,JSB 没有lua快,我觉的lua 天生就是做嵌入式脚本的命, 但是spidermonkey的 效率 以为足以支撑 客户端啦 ,(0.1ms 比 0.2ms 快,嗯 是的,但是用户感觉不出来),而且 JSB 的整套解决方案中 ,压根不存在反射,完全的静态绑定 unity 内部类,所以说,效率问题你放心,原理和 cocos-js 是一样的。
================================================= 结语 =======================================
我前一个项目用的是lua,我写起来很蹩脚,我觉得写大型项目 c# ,比lua 要好一点,纯个人见解。我现在用的是JSB,开发效率很高,我一位新同事,c# 学了一两个月,写热更新代码,无压力。这就是我的亲身实践,也欢迎你了解jsb ,使用jsb
qq 群:189738580。我们等你奥