美文网首页
Unity 热更新为啥用Lua 详解

Unity 热更新为啥用Lua 详解

作者: 派大星_5274 | 来源:发表于2019-03-20 16:30 被阅读0次

他们说

  阅读了网上一些文章,其实使用C#进行热更新是可以的,将需要更新的代码打包成程序集,然后利用反射即可,但是也提到在IOS平台是不行的,至于为什么不行,就不再说了,然后就是推荐Lua作为热更新方案,但是,为啥Lua就行?C#就不行?

因为C#是编译型语言,Lua是解释型语言?

  好多人都说Lua能热更新,是因为它是解释型语言,不用编译,在运行时能动态解释Lua代码并运行。这种方法实际上不准确,从某些角度来说是错的。Lua确实是解释性脚本语言,但是不是因为是解释型才能进行热更新。即使使用C++这种编译语言,也能进行热更新,将动态链接库进行更新就是,然后动态加载动态链接库获取更新的函数地址即可。

  而且,还有一点,C#并不能说是一种编译型语言,C#代码会被编译成IL,IL解释成机器码的过程可以在运行之前进行也能在运行时进行。如果在运行时进行解释,那么和Lua不就一样了吗,为啥C#不能进行热更新呢?

JIT对IL进行解释执行的原理

  首先说一下,JIT对IL如何在运行时进行解释并执行的,大致过程为:将IL解释为所在平台的机器码,开辟一段内存空间,要求这段内存空间可读、可写、可执行,然后把解释出的机器码放入,修改CPU中的指令指针寄存器中的地址,让CPU执行之前解释出来的机器码。

  注意这段内存的条件,最重要的一条是必须是可执行的,一般的内存申请我们只是存放数据,但是这里的内存权限要是有可执行权限

IOS限制了什么?

  IOS不允许获取具有可执行权限的内存空间,这就直接要求JIT要以full AOT模式,这种模式会在生成之前把IL直接翻译成机器码而不是在运行期间,进行了这种操作C#从某种角度来说和C++一样,成为了编译型语言,失去了运行时解释的功能。

Lua的解释执行怎么就行呢?

  如果Lua的解释执行原理和C#相同,肯定也不能在IOS平台上运行时解释执行。Lua是使用C编写的脚本语言,它在运行时读入Lua编写的代码,在解释Lua字节码(Lua自己的指令)时不是翻译为机器码,而是使用C代码进行解释,不用开辟特殊的内存空间,也不会有新代码在执行,执行的是Lua的虚拟机,用C写出来的虚拟机,这和C#的机制是完全不同的,因为Lua是基于C的脚本语言。

总结

  说白了,就是由于Lua这种脚本语言的特性,基于已经存在的某种语言的一种新的语言,这也是脚本语言和C#、C++这类语言的本质区别。当然,Lua虚拟机不仅可以使用C写,也可以用C#写。使用热更新也不一定非要用Lua,Python同样可以,只不过Lua短小精悍,本身代码长度就不是很大,可以从GitHub上看到。

什么是IL

        中间语言(中间代码)是一种面向语法,易于翻译成目标程序源程序的等效内部表示代码。其可理解性及易于生成目标代码的程度介于源语言和目标语言之间。常用的中间语言有逆波兰表示、四元式、三元式和树表示等。

什么是JIT编译

      运行时需要代码时,将 Microsoft 中间语言 (MSIL) 转换为机器码的编译。

相关文章

  • Unity 热更新为啥用Lua 详解

    他们说 阅读了网上一些文章,其实使用C#进行热更新是可以的,将需要更新的代码打包成程序集,然后利用反射即可,但是也...

  • 学习常用链接

    //Lua Lua table详解 Lua 元表详解 云风博客 //Unity Unity知识点 栈和队列 Uni...

  • LuaFramework

    ULUA简介: ULUA:Unity AssetStore 中一款热更新插件Lua Framework 的简称,2...

  • Unity--Lua热更新

    一、什么是热更新? 一般游戏上线后,玩家下载了第一个版本,在运营的过程中,会不定时的发布新的版本,如果不使用热更新...

  • c#和lua的交互的优化

    lua是目前最强大的unity热更新方案,毕竟这是唯一可以支持ios热更新的办法。然而作为一个重度ulua用户,我...

  • unity_lua热更新_语录

    ** lua 调用unity方法中,如果是静态方法要用 "." 如果是非静态方法要用 ":"** 1.lua中字符...

  • [Unity]基于IL代码注入的Lua补丁方案

    本分享的想法源于看了这篇分享由于在对Unity项目后期进行lua热更新方案实施, 我也不想造成源代码的修改, 故在...

  • Unity开发时自动热更新Lua代码

    在游戏开发阶段中,经常需要小修小改,Unity提供了很方便的Scene窗口,让开发者的修改马上生效,而不需要重新启...

  • InjectFix实现原理

    Tags: C#, Unity, 热更新 简介 InjectFix是腾讯开源的Unity C#热更新解决方案。本文...

  • 【文集】Unity的热更新

    热更新对游戏很重要,但是unity自身是不支持热更新的,因此这方面还是有不少方案和文章 Unity热更新之LuaI...

网友评论

      本文标题:Unity 热更新为啥用Lua 详解

      本文链接:https://www.haomeiwen.com/subject/vyltvqtx.html