找回密码
 立即注册
查看: 1021|回复: 12

[笔记] 为什么Unity没有实现iOS平台代码热更新?

[复制链接]
发表于 2020-12-23 19:42 | 显示全部楼层 |阅读模式
为什么Unity没有实现iOS平台代码热更新?
发表于 2020-12-23 19:49 | 显示全部楼层
题主的问题:
Mono无法在非AOT模式下关闭JIT模式下运行吗?如果可以我觉得完全有可能在Mono层去掉AOT编译,关闭JIT就可以实现。还是说已经实现了,只是因为其他的原因没有人用?
Mono的执行引擎有两种实现思路:
    编译:把MSIL编译为机器码。编译的时机可以在运行时(JIT编译),也可以在运行前(AOT编译)。
    解释:Mono有解释器实现,不过它只用于在移植到新平台时方便运行时和JIT编译器可以并行开发,JIT编译器开发好之后解释器就“退休”了。所以在发布出来的Mono build里都没解释器…(微软自家的CLR也是这个情况)。另外在最新的Mono里解释器已经被彻底去掉了:[runtime] Remove the interpreter. by kumpera · Pull Request #1248 · mono/mono · GitHub
于是对用户来说,Unity带的Mono就是不能配置成解释模式,而必须用编译模式的…

话说题主能补充一下目标使用场景不?
所谓“热更新”代码是类似不通过AppStore下载更新,而直接下载更新代码并反映在应用里么?也就是说是一种部署场景的需求而不是调试场景的需求?
发表于 2020-12-23 19:55 | 显示全部楼层
(有11张图,手机党酌情打开)
刚好上周CJ上Unity展台开展的技术讲座中有一节就是讲Unity iOS热更新的,照了照片,简单跟大家分享一下,可能稍微有点不对题,大家捡有用的看。

首先,正如大家说的,Apple是不允许代码热更新的,Unity也只是给有热更新需求的提供一些建议,不会在官方层面提供解决方案,除非Apple放开。


然后讲了Unity热更新的注意点和Unity的几个重要路径





然后是使用Lua进行iOS热更新的总体流程



最后对支持Unity iOS热更新的各种插件进行了对比





后面还有自己写的案例做的性能分析,拿uLua(Asset Store官方商店上的)、uLua&cstoLua(这两个最终肯定会统一)、sLua做对比,照片没拍,总共有六七种情况的对比,总结下来就是uLua(Asset Store)的性能消耗要比uLua&cstoLua和sLua大的多。
因为答主本身没有亲自做过iOS热更新,有不对的地方希望大家提出来共同讨论

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2020-12-23 20:03 | 显示全部楼层
最近刚好在在研究Mono就来回答下这个问题。

我们知道C#脚本首先会被编译成IL代码,然后再由CLR从内存中读取这些IL代码并将其转化为原生代码,这是.NET程序的运行机制,而Mono是.NET在开源社区中的一种实现,Mono对C#代码的编译分为两种,即即时编译JIT(动态)和提前编译AOT(静态),这是Mono能为我们提供的两种编译方式。

而从客观上来讲,iOS禁止通过JIT这种方式来编译,所以你无法绕过AppStore直接对程序进行更新,因为即使你更新了C#脚本,由于这些脚本是没有经过编译的,它是无法直接运用到实际环境里的,而使用Lua进行热更新,实际上改变的是应用层的逻辑,核心逻辑依然是在游戏发布时就和应用程序一起打包了,因为Lua无需编译,所以它可以像普通文本资源一样更新,和C#一样Lua无法在运行时期间产生新的代码,它永远都是调用已存在的代码。

所以综上所述,Unity引擎在iOS上无法热更新的关键是在iOS系统禁止了即时编译JIT这种权限,这个锅Unity和Mono都不背,谢谢!
发表于 2020-12-23 20:08 | 显示全部楼层
楼上已经把原因说的很明白了。
iOS是不允许不通过AppStore更新代码的。
Mono和Unity当然不会跟规定对着干。

作为开发商你想绕过这些自己做热更新也不是没有办法。
一个极端的例子就是WebView,js代码随便你怎么改不会有人管你的。
又或者UniLua之类的解决方案。

但是注意,这些玩法其实都是不符合规定的。
所以如果万一搞大了苹果想要搞你就是分分钟的事。

其实我一直觉得现在手游对于热更新的需求没有想象中的那么大。
设计阶段做扎实一点,用数据驱动更新可以满足99%的case。
发表于 2020-12-23 20:15 | 显示全部楼层
iOS本身不允许动态生成代码,所以没法JIT吧?

Limitations | Xamarin

No Dynamic Code Generation
Since the iPhone's kernel prevents an application from generating code dynamically Mono on the iPhone does not support any form of dynamic code generation.
发表于 2020-12-23 20:23 | 显示全部楼层
【匹夫细说Unity3D(六)——谁偷了我的热更新?】
【uLua最新的Unity+Lua热更新解决方案!!!】
李剑英 - 开发者干货区-u3d游戏开发者社区【游戏蛮牛】unity3d官网
发表于 2020-12-23 20:24 | 显示全部楼层
mono jit 内存上没有执行权限 所以做不了热更。用各种lua去做也是很笨的方式。
发表于 2020-12-23 20:31 | 显示全部楼层
首先,从技术层面上可以实现。题主也知道。
其次,苹果明文规定不让应用下载code,但是大陆游戏还是在明目张胆地下载lua字节码,这是苹果睁一只眼闭一只眼吧。
最后,最重要的原因,使用Unity的人对于热更新需求没有那么大。在大陆,热更新才是必备的硬性要求。所以土生土长的Cocos2D所有版本都具备热更新功能。而看Unity使用者的比例来看,使用Unity的人并不会把热更新作为一个硬性要求,看一下uniLua sLua之类的项目,也都是国人在作为主要吧。归根到底,还是需求决定。
发表于 2020-12-23 20:37 | 显示全部楼层
请参考20160701广电通知。。热更的同学一路走好~
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-19 12:01 , Processed in 0.093753 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表