1)游戏我的项目中如何制订资源管理与加载策略
2)对于热更新包体大小的最佳实际
3)URP某些Shader资源屡次呈现
4)对于手机发热问题如何动手
5)如何优化Delegate.Add/Remove这类堆内存的调配
这是第267篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
Addressable
Q:第一个问题:当初Addressable的应用状况怎么样?应用相似Xassets一类的插件用于资源管理怎么样?
第二个问题:游戏启动的时候,热更资源,资源文件下载是以散文件的形式一个个下载好,还是打成一个整包下载好?
第三个问题:以前咱们把AssetBundle包打到安装包内,而后装置完之后第1次启动时要把AssetBundle包解压到里面文件夹。这么做的益处就是对立保护一个内部资源目录,加载资源时不须要先判断里面目录再判断外面,而后依据资源在哪个目录写两种不同的加载形式。然而如果解压到里面,装置完之后整个游戏会增大很多。据说加载包内的资源比加载包外的更快,所以想问一下有没有必要再做解压这一个步骤?
A1:答复如下:
1.当初不太倡议应用原生Addressable,因为在目前看到的一些我的项目中,冗余问题仍然存在,而且无论是加载还是内存,问题都很多。加载的效率并不高,一旦做错,还会造成更差的问题,容错率比拟低。
当初的大型团队基本上都在本人写这套零碎了,便于查找起因。加载这块属于一个游戏的骨架(龙骨),不出问题没人留神,一出问题就有可能是致命的。
2.Xasset没做过调研不太分明。
3.打成一个整包的,而后做差异化包,版本跨度越大,差别包越多,大文件下载也要思考到断点续传的问题和多线程下载。要做很多解决,可能要接一个小插件,做减速、做断点续传、做多线程等,容易出问题。
散文件、颗粒度比拟小,每次更新就更新几个文件,不必生成差别包。大版本更新就会下很多文件,然而不必思考它的断点续传,因为文件比拟小。还有一个益处就是同时能够起多条链接下载,安卓目前勾销了链接数量下限,然而IO会很多。
4.没有必要解压,它在包内StreamingAssets下也是非压缩的,所以加载效率没问题。
该答复由UWA提供
A2:冗余问题, 预计他们是没有用Analyze工具剖析冗余,我做过试验用Analyze工具剖析解决冗余后,把生成后的Bundle提交到UWA的资源查看,剖析失去的后果合乎预期,没有意外的冗余问题,根本查看出的冗余,只有你用工具解决了,剖析后冗余就不存在了。
感激在路上哈哈@UWA问答社区提供了答复
A3:略微补充一下:
1.Addressable针对做分包(外围包、可选包等)反对并不好,尽管有Catalog的别离下载更新,然而制作层面却没有很好反对。异步加载流程不能被Cancel掉,一旦发动必须走完,最初说这个资源不要了。它算是一项可选的比拟通用的解决方案,但还是太通用和高级,一些中小型我的项目还是能够用的。然而我的项目一旦做简单点,需要多了就可能应酬不了。当然这也是Unity团队无奈八面玲珑、对应齐全的。一种思路是后期应用它,而后须要安顿人深刻了解和把握,到我的项目中后期呈现需要的时候入手改,毕竟代码都有。绝对本人从0开始做一套零碎还是有劣势的。2.下载环节还是倡议思考合包下载,毕竟不停开关N个HTTP连贯耗费也是不少的,尤其当下载的粒度太细,Patch自身Size很小的状况下,会发现下载速度上不去。能够思考客户端解决上还是小文件,但服务器端将相干Patch整顿在一起合进大文件,而后利用HTTP的Range下载模式来定位下载这个大文件中一部分间断数据,这样缩小HTTP连接数,进步下载效率。
3.读取在StreamingAssets内的AssetBundle文件不大,引擎本人搞定,然而读取非AssetBundle的资源,在Android平台下须要自行处理一下,无奈用File.Open的模式关上,须要接入NDK的AAssetManager接口来拜访。
感激黄程@UWA问答社区提供了答复,欢送大家转至社区交换:
AssetBundle
Q:对于热更新包体的大小,最佳实际是多少?多大以上的更新倡议不采纳热更新而采纳全包更新?如果一次更新的内容比拟大,是否倡议还是全包更新比拟适合?蕴含多个AssetBundle。
A1:基本上当初AssetBundle都曾经将其每个大小管制在5~10MB以下(5.3以前是1MB),这样就能够保障IO次数和热更新内容都尽可能小。
整包更新都不太好,会有大略10~15%的用户散失,所以能热更还是热更。热更新包的大小次要是去除冗余,因为LZ4自身曾经是压缩级别了。
感激OCEAN@UWA问答社区提供了答复
A2:国内渠道商比拟多,获客老本比拟高,所以换包的损失比拟大,能走热更新还是尽量走热更新。
而后也能够考虑一下国内的一些第三方热更公司,比方乐变,他们反对无感知边玩边下,以热更新的形式替换主包。
感激萧小俊@UWA问答社区提供了答复,欢送大家转至社区交换:
Shader
Q:如下图所示:
1.景象:这些资源呈现2份是什么起因?
2.目前Shader内存占用太高了,是否给些举荐倡议?
A:1.在编辑器中,当GraphicsSettings外面设置了RenderPipelineAsset之后,RenderPipelineAsset最终会援用PostProcessData,PostProcessData中援用了各种后处理相干的Shader,所以打包的时候,会将各种后处理相干的Shader打包进包体,比方UberPost、Bloom等。
而且这些资源会在RenderPipeline初始化的时候被加载进内存。这是UberPost的第一个实例的起源。
2.当咱们在游戏实时运行的时候,比方波及到切换RenderPipeline的操作,应用了AssetBundle加载RenderPipelineAsset,这样在AssetBundle中就又有了一份PostProcessData,因而这些后处理相干的Shader就又被加载了一次。总共就有2份UberPost了。
3.对此咱们倡议所有的RenderPipelineAsset相干的资源都由AssetBundle解决,在Editor的GraphicsSettings中将RenderPipelineAsset移除。通过脚本来动静从AssetBundle中加载并赋值。
4.能够创立一个空场景放在所有场景之前,在这个场景中动静加载RenderPipelineAsset,并赋值给GraphicsSetting.renderPipelineAsset,如下图:
之后所有的问题都只有留神AssetBundle的冗余就能够了。
优化Shader:
1.UberPost的Shader能够思考将用不到的Keyword给正文掉。如下图:
2.对于内存占用十分多的Shader,须要优化Keyword组合数量,倡议参考《Stripping scriptable shader variants》,应用后处理来优化Shader变体组合数量。
感激始终有点困的仓鼠@UWA问答社区提供了答复,欢送大家转至社区交换:
Performance
Q:对于手机发热问题,该从哪些方面动手?咱们我的项目次要有大量PBR,另外模型都是高模。是不是手机性能越高,发热越显著?
A1:这个能够反推一下:
发热=耗电高
耗电高=GPU CPU高负荷
最无效的形式应该是先锁帧,而后就是想方法优化GPU和CPU了,针对这2个优化计划有很多,能够找找适宜你们我的项目的。
感激萧小俊@UWA问答社区提供了答复
A2:答复如下:
1.发烫的问题都是从CPU\GPU和IO动手的。
2.不是。性能越差,同样的计算力,发热才会更显著。这块集体认为是须要定位下耗时在哪里才好做判断的。没有对立说性能好发热也显著的说法。比方:你们做了分级策略,在高端设施上开的成果越大,那天然发热发烫就显著。
感激OCEAN@UWA问答社区提供了答复
A3:发热是肯定会有的,并不是说做好了之后就没有发热,而是多久能发热到多少度,达到一个预期就行:
1.首先要定好分级策略,其次再查对应分级设施上的发热问题。
2.还有就是先限度好30帧,做好30帧的发热问题,再去做高帧率的发热问题。
3.能够通过UWA的温度模块看发热的趋势,还是比拟精确的,温度过高就会导致降频。
4.就咱们我的项目解决发热的流程来看,发热与功耗是正相干的。这个功耗可能是CPU,也可能是GPU,功耗能够通过PerfDog查看,也能够参考雨松的文章《Unity3D研究院之实时获取手机电流、电压、计算功率发热(一百一十八)》,别离测试CPU和GPU哪块功耗高具体定位一下。
PBR我的项目可能次要是GPU,GPU次要就是带宽和计算量,带宽占大头,带宽也分为两局部Read/Write Bandwidth。Read是上传几何信息和贴图,Write次要是写回到FrameBuffer和RT的存储,对于带宽能够应用Arm MS StreamLine工具或者PerfDog辅助查看一下(只有Mali的GPU能够看),到最初可能还是让美术去优化资源。
5.CPU的就要具体模块具体看了,留神线程的应用。Profiler看不到,过后咱们就是遇到线程内的问题导致的发热,查起来比拟麻烦。
感激范世青@UWA问答社区提供了答复,欢送大家转至社区交换:
Script
Q:如何优化Delegate.Add/Remove这类堆内存调配问题?
A1:升高应用频率,尤其是不要在一个代理里加过多的函数,会导致其堆内存调配更大,因为其实现原理是复制一个List来应用的。
感激OCEAN@UWA问答社区提供了答复
A2:其实Delegate的+= 是会有很重大的GC问题的,能够思考用一个字典去代替。
感激萧小俊@UWA问答社区提供了答复,欢送大家转至社区交换:
20210913
更多精彩问题等你答复~
1.Vulkan API的性能及兼容性
2.Unity TMP字体计划如何抉择
3.如何实现AAB包的增量更新
封面图来源于网络
明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官网技术QQ群:793972859(原群已满员)