关于ab:游戏项目中如何制定资源管理与加载策略

112次阅读

共计 4405 个字符,预计需要花费 12 分钟才能阅读完成。

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(原群已满员)

正文完
 0