关于Addressables作启动热更资源的路径问题

1)关于Addressables作启动热更资源的路径问题
​2)Unity 2018 Android平台Blit Type设置为Never时画面会变暗
3)视频压缩方案
4)关于AssetBundle中的资源冗余的问题
5)Addressable如何让加载的时候不对比服务器
css


UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
html

Addressable

Q:关于Addressables作启动热更资源的路径问题,将部分资源在可寻址系统里打入了StreamAssets,并将资源设置Cannot Release。打出程序后修改资源,作热更流程,而后运行程序也正常检测热更并下载,可是下载的更新AssetBundle包并不在PersistentDataPath路径下。若是是在同一机器下,热更包会在Unity编辑器的Temp路径下找到,但是我将程序拿到什么都没装的新电脑下,程序仍是能检测热更下载,但PersistentDataPath仍然看不到热更AssetBundle,求解。json

A1:Addressable下载更新用的是缓存的方式,因此不会在PersistentDataPath里面,会在应用的默认缓存目录里面,以下图:缓存

若是须要修改缓存的路径,这个能够试下:

最后拉进去AddressableAssetSettings的Initialization Object列表里就行。

感谢Toushirou@UWA问答社区提供了回答服务器

A2:感谢您的帮助,该方式确实能够重写缓存路径。值得注意的是Cache Directory Override并不能彻底像Addressables Profiles里路径同样配置可变路径,只支持了带“{}”的方式,如{UnityEngine.Application.persistentDataPath},带“[]”则不支持配置。再次感谢层主的帮助!网络

另外,上层Cache Directory Override最终调用的源码,可根据本身的需求拓展,以下图:app

感谢题主兮风@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。ide

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,这个有点难,也很累,排查起来比较困难。

个人解决方案:

  1. 除了Background,禁止Rawimage挂Texture,而说实话,个人Background都作了RGBA分离,因此Rawimage挂的是Material,而Rawiamge不挂Texture是由于咱们项目都是异步加载了的,尽可能保证Prefab先出来,后面不重要的异步出来。

  2. 禁止粒子特效挂在到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(原群已满员)

相关文章
相关标签/搜索