大家现在都是怎么实现热更新的?

1)大家现在都是怎么实现热更新的
2)SLG或者策略游戏的联盟边界线是如何实现的
3)实现门窗破碎效果并且性能好的方案
4)Screen.SetResolution和UniversalRenderPipelineAsset.renderScale有什么区别


这是第366篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。

UWA社区主页:community.uwa4d.com
UWA QQ群:465082844

Script

Q:大家现在都是怎么实现热更新的?除了C#反射这个老办法、或者Lua,大家还用了什么办法吗?以及有人不用热更新吗?想在立项阶段先做个调研,避免之后填坑,谢谢各位!

A1:Lua缺点是很多,原因很大一部分是因为大家用的是ToLua这种一揽子解决方案。本身Lua就慢,ToLua为了让大家像C++上使用Lua那样快速上手,在底层做了不少事情,包括对UserData的处理(导致了Lua的GC和C#的GC冲突)和对LuaState的OOP化。对C#的无脑Wrap和对Lua的OOP改造也进一步加剧了这些问题。更何况,Lua和C#之间并没有大家想象中那么契合。一个最简单的例子,任何Lua传给C#的String都是新的GC Alloc。然而,对于热更新方案,我们并没有太多的选项,Lua算是一种比较成熟、性能上勉强能用的方案,最重要的是,用的人要真的会(不仅仅是会语法),那么性能上才不会有大问题。当然,还是要期待大牛研发出更优雅和优秀的方案。

感谢凯奥斯@UWA问答社区提供了回答

A2:ILRuntime本质上就是为了iOS热更(代码)而开发的,Android热更可以用ILRuntime,也可以完全不用。

说回正题,一般热更新分两块:代码+资源。资源热更新几乎都是通过AssetBundle来实现,代码热更新可以用某种解释器+解释执行的语言来实现,可供选择的有Lua、AS3、Python、JS、C#等,据我所知,主流是Lua,次主流是C#。

热更新的选择上,我们项目最初所有代码都是C#写,不考虑热更新是因为团队没一个人会Unity 3D,全是边学边做,"做出来"是第一要务。上线后自然顶不住运营的压力,在中国很多Android渠道的情况下,运营的这个需求是合理的,否则每次版本更新,各个渠道审核-上线的时间同步是非常困难的。

然后我们首先用xLua打补丁修Bug,这样成本最低,后来运营要求能通过热更新加功能,而不仅仅是改Bug,那么要么用Lua写所有可能会被热更新的代码,这需要把现有的大量C#代码翻译过来;要么想办法让C#能热更新。很自然就选择了后者+ILRuntime的方法。

最后的技术方案是这样:

  1. 基本限制
    热更新部分的代码都不继承MonoBehaviour,也就是都不挂脚本,非热更新部分随意,热更新对MonoBehaviour这种比较特殊的东西的支持都挺麻烦,要么不用;要么只是做个不可热更新的消息转发层;要么开发时挂脚本,打包时用某种特殊的方式把它变成代码里动态AddComponent。

  2. Android
    不用任何第三方的热更新方案,用C#反射执行DLL,性能和代码写法和纯C#基本一样。

    19年9月Google Play强制要求APP都支持64位,Unity的应对方案是Android IL2CPP,暂时没有支持Mono Backend 64位的打算,而且Unity IL2CPP实现的真不怎么样。所以到时候只能是IL2CPP + ILRuntime的方式,性能差的一大截,主要慢在ILRuntime上。

  3. iOS
    ILRuntime + DLL解释执行,当然是在IL2CPP下。

  4. 优点
    语言(C#)开发环境工具链统一,随时可以变成不支持热更新形式,如果苹果未来不允许任何解释执行的方式。

    框架搭好后,满足一些限制条件(非硬性限制,主要是避免麻烦,限制主要是1个,可热更部分的代码不要继承不可热更的代码,不继承MonoBehaviour是这个限制的子集),写逻辑的同学开发方式和原生C#开发完全一样,包括调试。

    第三方插件直接可用(大部分插件都是基于C#写的)。

  5. 缺点
    稳定性的坑还是有一些,通常发生于一些相对高级的语言特性组合,特别是各种反射代码。另外.net4.6的asyncwait支持现在的版本应该也还不够稳定。

    纯计算的性能弱于Lua,计算密集型的代码还是想办法放在不可热更新的部分吧。

    历史短,Git贡献者少,项目考验少(据我的了解,上线的商业项目在x-1x之间,具体的项目有MMO,有SLG,有休闲,也有棋牌),原理上大的优化空间没有,小的优化空间还是有一些;另外整合了各种常用Feature的框架也少,虽然我感觉这块基本都会自己写。

感谢gx@UWA问答社区提供了回答

A3:当前以及未来主流热更方案:HybridCLR
https://edu.uwa4d.com/course-intro/0/432

感谢黄大仙@UWA问答社区提供了回答


Rendering

Q:请问SLG或者策略游戏的联盟边界线是如何实现的?类似下图这种很平滑的边界线是怎么实现的呢?

 

A:在战争迷雾吧有类似魔兽争霸地图贴花的算法可以参考:
https://www.cnblogs.com/sifenkesi/archive/2011/03/03/1970051.html

感谢牛头人不服@UWA问答社区提供了回答


Rendering

Q:大家有没有游戏中实现门窗破碎效果性能好的方案?目前使用的插件是RayFire for Unity。

针对以上问题,有经验的朋友欢迎转至社区交流分享:
https://answer.uwa4d.com/question/65780e323625c22cffcb1d7b


Rendering

Q:之前低端机都是通过Screen.SetResolution降低渲染分辨率提高性能,发现UniversalRenderPipelineAsset有一个renderScale也可以降低渲染效果。想请问下,两者本质区别是什么?在低端机两者一起降会更好?

针对以上问题,有经验的朋友欢迎转至社区交流分享:
https://answer.uwa4d.com/question/657bbfff40a8d93b624afc25

封面图来源于网络


今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。

UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:465082844

posted @ 2023-12-21 17:20  UWATech  阅读(7)  评论(0编辑  收藏  举报