共计 2777 个字符,预计需要花费 7 分钟才能阅读完成。
1)为什么 Unity 应用 AssetBundle 热更的时候要剔除掉.mainfest 文件
2)Addressable 热更,断点续传问题
3)在线性空间,应用后处理解决 UI 混合问题
这是第 341 篇 UWA 技术常识分享的推送,精选了 UWA 社区的热门话题,涵盖了 UWA 问答、社区帖子等技术知识点,助力大家更全面地把握和学习。
UWA 社区主页:community.uwa4d.com
UWA QQ 群:465082844
AssetBundle
Q:为什么 Unity 应用 AssetBundle 热更的时候要剔除掉.mainfest 文件?
A:在应用 AssetBundle 热更时,Unity 会将每个 AssetBundle 的依赖关系和元数据保留在一个名为文件的文件中。
这个文件形容了 AssetBundle 的版本、蕴含哪些资源以及它们之间的依赖关系。
.mainfest 文件在构建 APK 或公布 AssetBundle 包时会被打包进去,无奈通过热更形式更新,在进行 AssetBundle 热更时,如果不剔除掉文件,则新下载的 AssetBundle 的文件会笼罩原来的文件,导致所有曾经下载的 AssetBundle 都须要从新下载,因为它们的依赖关系信息曾经失落。因而,须要在进行 AssetBundle 热更时将文件从打包列表中剔除,以避免出现这种状况。
感激曼华 @UWA 问答社区提供了答复
Network
Q:利用 Addressable 进行热更,采纳 Disable Catalog Update on StartUp 形式,当更新进度没有实现时杀掉游戏,再重新启动游戏,此时 catalogs.Count 曾经等于 0,并不会在此触发更新,但其实还有局部资源未更新到,这种状况下应该怎么解决?
1. 首先不能放玩家进入游戏,因为资源不匹配。
2. 触发游戏从新更新,此时 catalogs.Count=0,并不会更新资源。
- 这种状况下是否能够应用 Addressables.ClearResourceLocators() 和 Caching.ClearCache() 清理缓存和曾经下载好的资源,再次触发热更,这时 catalogs.Count 应该是不等于 0 的吧?
不晓得大家都是怎么解决:资源更新一半杀掉游戏,从新登录游戏?
另外,AddressableAssetSetting->Catalog->Player Version Override 这个设置应用的是默认的 time stamp 还是指定了一个版本号?我这里指定了一个固定版本,导致 catalogs.Count=1,永远只是更新这次和母包的差别,比方两头曾经有几次热更了,会把两头几次的热更给抛弃。针对这个问题,更新策略是怎么样的?
A1:不应用 Addressables.UpdateCatalogs(),本人去服务器上下载 Catalog 文件,如果下载到一半了,勾销,不批改版本号。下次进来接着去服务器下载 Catalog 文件。而后本人下载的 Catalog 文件能够用 Addressables.LoadContentCatalogAsync() 加载,而后失去 IResourceLocator 的所有 Key,把所有 Key 传入下载列表中进行下载资源文件。
感激 liu@UWA 问答社区提供了答复
A2:进入游戏第一次 Check,之后的那些异步操作都用缓存保存起来即可。
感激京一 @UWA 问答社区提供了答复
A3:第一,你用 Disable Catalog Update on StartUp 形式启动,就是默认不更新 Catalog,然而在走前面更新的时候,Catalog 其实曾经更新完了,再调用 API 更新 Catalog 天然没有了。这时只有去 GetDownloadSize 而后间接更资源就行了。
Catalog 的更新和资源更新是两个阶段。最好离开治理。
第二,AA 其实只比拟资源的 Hash,因而没有版本号概念,所以不存在两头版本,永远是最新版本和母包。这个 PlayerVersionOverride 指你打 Player 的那个版本号,个别是更新母包时才递增。这种做法能够保障不论玩家手里是哪份资源,都能更到最新的,并且防止两头的逐版本升级流程。
再有,Keys 根本还是须要本人去治理,比方你本人治理了 20 个 Keys,而后调用 Addressables.UpdateCatalogs() 后通知你其中 5 个更新了。那么如果你立刻调用 GetDownloadSizeAsync 和 DownloadDependenciesAsync,能够马上传入这 5 个 Key。另外一种状况可能你这一次游戏中 UpdateCatalogs 取得 5 个更新。然而要到下一次启动游戏才调用 GetDownloadSizeAsync 和 DownloadDependenciesAsync,那你能够把这 20 个 Keys 都传进去。
感激黄程 @UWA 问答社区提供了答复
UI
Q:线性空间,美术资源是在 Gamma 空间制作的,参考该办法:
https://blog.csdn.net/euphorias/article/details/125558348
UI 成果是对了,然而显著整个界面变暗了,请问大家是如何解决这个问题的?
依据网上的教程,改了下,多了 4 个 Blit,是否还有性能优化空间?
A1:如果用 URP,能够批改 URP 源码,场景上应用线性空间,UI 应用 Gamma 空间。<br/>
Git 上有对应开源代码,实用的 Unity 版本不同,也都有点小 bug 须要修复:
UI_RenderPipelineInLinearSpace
URP-12-GammaUIAndSplitResolution
感激邹彬 @UWA 问答社区提供了答复
A2:如果 3D 相机的 Renderer 上有后处理,并且能改 URP 的管线,在 UberPost 的 Frag 最初间接做 LineraToGamma,可能就不必加 Pass。
而且,看起来这个后处理脚本是挂在了 UIRenderer 上,所以会影响到整体的色彩,能够试试在 ForwardRenderer 渲染完结后,UI 绘制之前,对色彩做一次 pow(color, 0.45)也就是 LinearToGamma 来中和最初的 UIRenderer 后处理的 pow(color, 2.2)。
感激范世青 @UWA 问答社区提供了答复
A3:针对“多了 4 个 Blit,是否还有性能优化空间”问题。间接 cmd.Blit(_source, _source, _material); 就能够了。
感激题主黄大仙 @UWA 问答社区提供了答复
封面图来源于网络
明天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,咱们遇到的问题只是冰山一角,UWA 社区愿伴你同行,一起摸索分享。欢送更多的开发者退出 UWA 社区。
UWA 官网:www.uwa4d.com
UWA 社区:community.uwa4d.com
UWA 学堂:edu.uwa4d.com
官网技术 QQ 群:465082844