1)对于Addressables做启动热更资源的门路问题
2)Unity 2018 Android平台Blit Type设置为Never时画面会变暗
3)视频压缩计划
4)对于AssetBundle中的资源冗余的问题
5)Addressable如何让加载的时候不比照服务器
这是第221篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
Addressable
Q:对于Addressables做启动热更资源的门路问题,将局部资源在可寻址零碎里打入了StreamAssets,并将资源设置Cannot Release。打出程序后批改资源,做热更流程,而后运行程序也失常检测热更并下载,然而下载的更新AssetBundle包并不在PersistentDataPath门路下。如果是在同一机器下,热更包会在Unity编辑器的Temp门路下找到,可是我将程序拿到什么都没装的新电脑下,程序还是能检测热更下载,但PersistentDataPath依然看不到热更AssetBundle,求解。
A1:Addressable下载更新用的是缓存的形式,所以不会在PersistentDataPath外面,会在利用的默认缓存目录外面,如下图:如果须要批改缓存的门路,这个能够试下:
最初拉进去AddressableAssetSettings的Initialization Object列表里就行。
感激Toushirou@UWA问答社区提供了答复
A2:感谢您的帮忙,该形式的确能够重写缓存门路。值得注意的是Cache Directory Override并不能齐全像Addressables Profiles里门路一样配置可变门路,只反对了带“{}”的形式,如{UnityEngine.Application.persistentDataPath},带“[]”则不反对配置。再次感激层主的帮忙!另外,下层Cache Directory Override最终调用的源码,可依据本人的需要拓展,如下图:
感激题主兮风@UWA问答社区提供了答复
A3:在安卓手机上安装一个apk,并且运行之后,假如这个apk的包名叫com.x.y,会在安卓手机上多3个目录:
目录1:sdcard/Android/data/com.x.y,这个目录下有一个cache目录。
目录2:data/app/com.x.y-1,这个目录下有目录lib和目录oat,还有一个base.apk。
目录3:data/data/com.x.y,这个目录下有有5个目录,files,shared_prefs,cache,code_cache,lib。
下面的目录1的sdcard和目录2的data是同级的。目录2和目录3须要root能力看到,没有root的手机应该是只能看到sdcard上面的文件。当我运行Addressable进行近程加载资源后,在目录1外面多了一个与cache同级的files目录,这个files目录应该就是Application.persistentDataPath。在这个files目录外面会多两个目录,别离是com.unity.addressables,这外面放的是catalog.hash和catalog.json,另外一个是UnityCache目录,外面有两个目录,Shared和Temp,Temp是空的,Shared外面放的是下载的AssetBundle。
Addressable应用的是Caching机制,所以是能够通过相似于Caching.currentCacheForWriting = Caching.AddCache(“D:/Shalou/UnityCaching/”);这样的操作在PC上更改缓存目录的,在Android平台上应该也是能够的,这个就和安卓的权限有关系了,没有做进一步的测试。猜想是,如果没有开启External的Write Permission,只能在目录1上面的files目录外面进行目录替换了,也就是只能在Application.persistentDataPath前面增加子目录来更改缓存目录。
在PC上,题主说的默认的缓存和persistentDataPath的确是两个门路,如下图:
感激Xuan@UWA问答社区提供了答复
Rendering
Q:有看到说Blit Type设置为Always会多出一次Blit操作,在2018下在真机测试了下呈现相似对比度变大,画面变暗的成果。改回Always就失常。
色调空间为线性空间。
这项设置有什么考究?
A:AndroidBlitType.Never不提供sRGB后备缓冲区。线性渲染须要一个执行sRGB读/写转换的帧缓冲区(请参阅RenderTexture.sRGB),否则生成的图像通常显得太暗。因而,在应用线性渲染时,不倡议应用AndroidBlitType.Never。如果想应用AndroidBlitType.Never进行线性渲染,只管有这些信息,您依然必须设置本人的sRGB渲染指标并解决针对后备缓冲区的Blit操作。能够参考一下网址:
https://docs.unity.cn/cn/current/ScriptReference/AndroidBlitType.html
https://docs.unity3d.com/ScriptReference/AndroidBlitType.html
感激小埃拉@UWA问答社区提供了答复
Video
Q:求教一下,对于视频来讲有什么比拟适合的压缩计划?目前咱们原始视频有近60MB,筹备压缩后放入StreamingAssets下,读取解压后播放。除了对VideoClip自身做解决外,还有其余计划么?心愿Android和iOS平台都通用。
A1:能够试试压缩成H.264或者H.265编码的MP4格局视频。
感激马三小伙儿@UWA问答社区提供了答复
A2:H.264兼容各平台在Unity 2018上。
感激Eureka@UWA问答社区提供了答复
Assetbundle
Q:用UWA检测AssetBundle资源冗余时,发现有17个资源冗余,然而通过比照查问Bundle的Manifest文件,发现这些冗余的资源都会独自打包成一个AssetBundle,并且没有存在于本人预设资源中,然而UWA给的论断是这份冗余的资源存在于他所在的各个预设当中,请问是怎么解?
A:我也是当初遇到的问题,Manifest没有这个冗余,AssetBundle加载进来,内存里你也没有发现这个冗余,调用GetAllAssetNames也看不到这个冗余的名字,然而如果调用LoadAllAssets,就呈现了这个冗余,十分神奇,藏的很隐秘。
起因:Rawimage挂的Texture,ParticleSystem援用UI资源。
冗余的危害我就不说了。解决方案:如果说尽量保障Rawimage的图和Prefab等资源打到一个AssetBundle,这个有点难,也很累,排查起来比拟艰难。
我的解决方案:
- 除了Background,禁止Rawimage挂Texture,而说实话,我的Background都做了RGBA拆散,所以Rawimage挂的是Material,而Rawiamge不挂Texture是因为咱们我的项目都是异步加载了的,尽量保障Prefab先进去,前面不重要的异步进去。
- 禁止粒子特效挂在到UI的Prefab上,并且写工具,禁止粒子特效的Prefab援用UI资源,因为粒子特效ParticleSystem形容文件缺失大,如果挂在UI上,还会造成Prefab可能上M数量级,影响加载速度,同时粒子特效和UIPrefab拆散,也不会造成冗余。
感激夏霖锐@UWA问答社区提供了答复
Addressable
Q:想做传统的那种,在进入游戏的时候对立加载更新,而不是目前这种,读取某个界面,就去服务器判断。
当初的问题是怎么让每一次加载的时候不去判断服务器,而在进入的时候判断全副更新。
A:能够在游戏启动的时候在一个专门的更新界面做更新,具体做法是先初始化,而后调用GetDownloadSizeAsync和Addressables.DownloadDependenciesAsync进行AssetBundle更新(Addressable是以AssetBundle为最小更新单元的),这样就会将所有须要更新的AssetBundle缓存到本地了,下次用到这些资源就不必近程下载了。大抵代码如下:
IEnumerator Start() { //只有打包的时候不要将Disable Catalog Update on Startup勾选上就行,这样初始化的时候会自动更新Catalog到最新 yield return Addressables.InitializeAsync(); IEnumerable<IResourceLocator> locators = Addressables.ResourceLocators; List<object> keys = new List<object>(); //暴力遍历所有的key foreach (var locator in locators) { foreach(var key in locator.Keys) { keys.Add(key); } } var handle = Addressables.GetDownloadSizeAsync(keys); yield return handle; long downloadSize = handle.Result; if (downloadSize > 0) { yield return Addressables.DownloadDependenciesAsync(keys, Addressables.MergeMode.Union, true); } }
在游戏过程中,Addressable初始化当前,只有不调用Addressables.CheckForCatalogUpdates和Addressables.UpdateCatalogs,内存中常驻的Catalog生成的映射表对象是不会产生扭转的,就算把服务器的Catalog和资源更新了也不会影响客户端的运行。
感激Xuan@UWA问答社区提供了答复
封面图来源于网络
明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官网技术QQ群:793972859(原群已满员)