临上线项目使用ILRuntime热更
前言
我们有一个用Unity引擎开发了二十个月的mmo arpg手游项目,在安卓已经测试三轮了,出于IOS的热的考虑且结合我们的情况:全部代码都是纯C#开发非Lua,所以计划使用ILRuntime热更,这里记录我们把这个项目用上ILRuntime热更的过程,包括遇到的困难和如何解决的。其它类型项目或其它项目架构的重点问题可能不一样
项目环境:ILRuntime版本 1.6.3 , Unity版本:2018.4.15f1
ILRuntime热更遇到问题
把项目大部分代码都搬到ILRuntime执行后,先说说从表现上我们遇到的问题:
GC Allow非常频繁
每隔5秒左右就会执行一次GC Allow,每次耗时200ms导致降帧,在手机上的GC Allow间隔时间会长一些
对象管理耗时
每个对象的update耗时在0.5~1ms,当场景内有100个对象时,只有几帧,基本卡住不动了。
对象管理耗时主要分布在对象的状态维护,对象显示/隐藏,头顶文字处理
空函数调用
一些空的Update函数调用,耗时在0.7ms
资源创建和销毁
在战斗过程中,技能特效的加载和创建第一次会顿一下
多人帧率低
场景内多人移动时,帧率会降低
界面打开瞬间掉帧
在界面第一次打开时,掉帧特别明显,这是因为在界面打开时有很多的逻辑
官方建议这些内容放主工程
通过咨询ILRuntime的作者蓝大,他建议把这些内容放在主工程
- 移动
- 资源管理
- UI框架
- 头顶文字
- 战斗(视情况是否放主工程)
- 对象管理放主工程
而我们项目由于完成度高,代码交叉调用多,只有极少部分内容放在主工程,其它内容全部放在热更工程中
通过Profiler看问题
好在是C#代码,把热更代码生成dll之后,在Unity的Profiler中查看耗时大的函数,可以看到具体的文件和函数名,这为排查重点耗时大户提供了极大的便利。
通过在Profiler中看到最大头的部分:
- 游戏中每个对象的update函数
- 红点检测会频繁遍历背包
- 一些网络包的处理
- 某些逻辑代码存在重复注册事件,或多次进入玩法出现函数重复调用
为什么对象的Update耗时会这么大?因为在主城中,一个地图中所有的npc,传送点,采集物都是由客户端本地管理,就算不在视野内也会执行Update,只是外观不显示。
而玩家则是由服务器的视野来控制,不在视野内的对象不会存在于客户端。
我们的解决方案
目前我们已经采取的解决方案有这些:
每个对象的Update进行分帧处理,不在同一帧处理,注意:仅对静止对象这样处理
去掉空的Update
把foreach改成for
把全局变量改成局部变量
修改红点的部分逻辑,避免每秒计算结果
临上线项目使用ILRuntime热更的更多相关文章
- lua热更框架之XLua
框架介绍 xLua是当下最流行的unity热更方案之一,作者是腾讯的车雄生前辈,自2016年初推出以来,已经在腾讯的多款游戏项目上应用,目前xLua已经开源到了GitHub.xLua最大的特色是不仅支 ...
- 客户端热更新框架之UI热更框架设计(上)
什么是热更新,为什么需要热更新? 热更新是目前各大手游等众多App常用的更新方式.简单来说就是在用户通过App Store下载App之后,打开App时遇到的即时更新.对于手游客户端来 ...
- Unity热更方案汇总
http://www.manew.com/thread-114496-1-1.html 谈到目前的代码热更方案:没什么特别的要求 <ignore_js_op> toLua(效 ...
- unity 热更方案对比
现在一般使用的方案有:tulua&ulua.xlua.ILRuntime 对比: tulua&ulua 方案成熟,稳定第三方库支持 xlua 之前是为了热更修复线上bug的,腾讯发起的 ...
- 实现iOS图片等资源文件的热更新化(三):动态的资源文件夹
简介 此文,将尝试动态从某个不确定的文件夹中加载资源文件.文章,会继续完善自定义的 imageNamed 函数,并为下一篇文章铺垫. 这么做的意义 正如我们经常所说的那样,大多数情景知道做事的意义往往 ...
- 实现iOS图片等资源文件的热更新化(五): 一个简单完整的资源热更新页面
简介 一个简单的关于页面,有一个图片,版本号,App名称等,着重演示各个系列的文章完整集成示例. 动机与意义 这是系列文章的最后一篇.今天抽空写下,收下尾.文章本身会在第四篇的基础上,简单扩充下代码, ...
- 实现iOS图片等资源文件的热更新化(零): 序
必要的序 以后在写系列文章,准备把基本的规划和动机等,单独作为一个小的序言部分给独立出来.序言部分,可以较为完整地交待系列文章的写作动机,所展示的编码技术可能的应用场景等.个人,我还是比较看重文章或者 ...
- 我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新
大家好, 我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新 . 简单的说, 原理就是 类似 Asp.net 那样 让 当前 WebApp 运行在一个 A ...
- Unity 代码编译成dll 更新dll实现热更代码
Unity 代码编译成dll 更新dll实现热更代码 实现流程 代码编译成DLL DLL打包成AssetBundle 加载AssetBundle 加载代码程序集 获取指定类 使用反射赋值 C#代码编译 ...
- Elasticsearch之中文分词器插件es-ik的自定义热更新词库
不多说,直接上干货! 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
随机推荐
- Solon2 接口开发: 实战 Gateway 模式效果
1.效果预览 网关 @Mapping("/api/v3/app/**") @Component public class ApiGateway3x extends UapiGate ...
- vim-修改键盘Tab键为四个空格
在 /etc/vimrc 文件后添加一行 set ts=4
- 【HZERO】feign调用
feign调用 https://open.hand-china.com/community/detail/603204901962649600 # Hiam获取用户信息示例
- 图标闪烁CSS
图标闪烁CSS代码 <!DOCTYPE html> <html> <head> <style> #markerDiv { position: absol ...
- 版本升级 | v1.0.12发布,许可证风险早知道
新版本来啦~~~~ 一.v1.0.12更新内容 优化许可证检出功能,可通过JSON / HTML / SPDX 报告获知许可证信息 支持HTML报告自定义分页 二.更新说明 1. 优化许可证检出功能, ...
- P1765
和那道题一样,这次用的getchar,结果对了可是洛谷评测WA了,换成scanf单个字符,结果还是WA了,换成直接getline读入整个字符串就对了. 可见读入单个字符的方式有可能出现各种小错,尤其是 ...
- C#查找算法1:二分查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列. 原理:将n个元素分成个数大致相同的两半,取 ...
- 解决pyintstaller 打包后程序报错 api-ms-win-core-path-l1-1-0.dll文件
一.错误现象 1.api-ms-win-core-path-l1-1-0.dll错误日志如下: 2.重新打包查看有如下的警告信息: 二.解决方案: 1.网上下载:api-ms-win-core-pat ...
- 机器学习-概率图模型系列-隐含马尔科夫-维特比算法解码隐藏序列-HMM模型参数估计-36
目录 待补充 参考资料 刘建平博客 pinard
- python · matplotlib | 如何绘制子图
代码: import matplotlib.pyplot as plt import matplotlib matplotlib.rc("font",family='MicroSo ...