首页 > 其他分享 >大家现在都是怎么实现热更新的?

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

时间:2023-12-21 17:22:27浏览次数:34  
标签:大家 社区 实现 代码 更新 Lua UWA C#

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

标签:大家,社区,实现,代码,更新,Lua,UWA,C#
From: https://www.cnblogs.com/uwatech/p/17919519.html

相关文章

  • Flutter AnimatedList 实现动态列表
    import'dart:async';import'package:flutter/material.dart';finalGlobalKey_globalKey=GlobalKey();classMyAnimatedListextendsStatelessWidget{constMyAnimatedList({super.key});@overrideWidgetbuild(BuildContextcont......
  • 基于vue3和elementplus实现的自定义table组件
    基于vue3和elementplus实现的自定义table组件,集成查询工具栏分页,可通过配置直接实现基础的列表页基于vue3和elementplus实现的自定义table组件,集成查询工具栏分页,可通过配置直接实现基础的列表页目录结构如下:类型声明:declaretypeDictType={value:string|boolean|n......
  • vue3 + xlsx 实现 excel 导入web页面解析成json数据
    vue3+xlsx实现excel导入web页面并解析成json数据fileIipt动态创建的标签,一定要用户点击事件触发,不然文件选择框的弹出会被拦截,无法弹出。意思就是下面这段关键代码要用一个事件区触发执行,不能主动执行(比如:vue的钩子)import*asXLSXfrom'xlsx'//v:"^0.18.5"letfil......
  • @所有人,携手微服务开发框架服务商,用科技之力实现新转型!
    新时代,新机遇,新挑战。在新的经济发展形势下,科技的力量是伟大的,也是能助力企业实现快速转型升级的。微服务开发框架服务商将立足低代码技术平台研发领域,加强自主研发创新能力,以市场为导向,全力协助各大中型企业实现流程化办公和数字化转型升级。研发低代码技术平台,流辰信息是一家研......
  • ETLCloud与简道云结合,实现企业信息同步
    ETLCloud介绍 ETLCloud是一个集离线数据集成ETL、ELT、CDC实时数据集成、编排调度、数据服务API为一体的数据集成平台(DataOps),一站式满足企业的各种最为复杂的数据集成场景。提供私有化部署能力和云原生架构,满足企业不同发展阶段的业务需求。 提供开放的组件市场,企业通过本......
  • java Page 实现根据字段名排序
    /***排序JSON格式*/@ApiModelProperty(value="排序JSON格式")privateStringorderBy;  @GetMapping("/page_manage")@ApiModelProperty(value="管理端用户管理分页",notes="管理端用户管理分页")publicRpageManage(Page<SysUser>page,......
  • Modbus转PROFINET网关TS-180快速实现软启动器和马达保护器与西门子PLC的通信
    在钢铁厂的生产过程中,电机作为驱动各种生产机械和辅助设备的关键设备,其正常运行对于生产效率和质量至关重要。为了确保电机的正常运行和使用寿命,通常会使用软启动器和马达保护器等设备,因此监控软启和马达保护器的工作参数成为重点。 福建某钢铁厂,中控室使用S7-1515PLC,实时监控现......
  • Cloudeye对接Prometheus实现华为云全方位监控
    本文分享自华为云社区《Cloudeye对接Prometheus实现华为云全方位监控》,作者:可以交个朋友。一、背景云眼系统Cloudeye服务为我们提供了针对弹性云服务器、宽带等资源的立体化监控平台。帮助我们全面了解华为云上的资源使用情况、业务的运行状况。将华为云Cloudeye服务接入prom......
  • Fastjson2基础使用以及底层序列化/反序列化实现探究
    来自于:https://www.cnblogs.com/6b7b5fc3/p/17134421.html1Fastjson2简介Fastjson2是Fastjson的升级版,特征:协议支持:支持JSON/JSONB两种协议部分解析:可以使用JSONPath进行部分解析获取需要的值语言支持:Java/Kotlin场景支持:Android8+/服务端其他特性支持:GraalNative-Image......
  • MDM主数据平台如何实现质量管控
    当企业业务以及信息化建设发展到一定阶段后,都不可避免地要进行信息化和数据的治理工作,而主数据治理则是数据治理的基础。随着信息系统和业务的增加,系统打通与数据集成共享必然会成为企业信息化建设的瓶颈,而要实现系统集成,就要保证系统中共享数据的准确性,而主数据就是最重要的共享数......