1)为什么Unity使用AssetBundle热更的时候要剔除掉.mainfest文件
2)Addressable热更,断点续传问题
3)在线性空间,使用后处理解决UI混合问题
这是第341篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。
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空间制作的,参考该方法:
URP下Alpha从Gamma空间到Linner空间转换(二)——多Alpha贴图叠加_urp gamma liner_euphorias的博客-CSDN博客
UI效果是对了,但是明显整个界面变暗了,请问大家是如何解决这个问题的?
根据网上的教程,改了下,多了4个Blit,是否还有性能优化空间?
A1:如果用URP,可以修改URP源码,场景上使用线性空间,UI使用Gamma空间。
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