关于Addressable的疑问
1)关于Addressable的疑问
2)Addressable如何进行热更新
3)如何设置SceneView相机的Shader变量
4)Activity默认为SingleTask的原因
5)关于Resources.UnloadUnusedAssets调用时间过长的问题
Addressable
Q:最近几天在看Addressable,虽然未完全看懂,但感觉这相比AssetBundle好用得多,也考虑得很周全。主要是在参考官方文档Addressables 1.6.2时,有一些疑问:
1. 相对AssetBundle,它的打包颗粒度如何控制的?比如说,AssetBundle可以自己控制多个资源打到一个AssetBundle中。
2. 有没有脚本可以自动设置Addressable名称以及Label?毕竟稍具规模的项目,资源量也不小,手工设置过去也不科学。
3. 关于Check for Content Update Restrictions,官方文档上有这样一句话:Note:This command will do nothing if all your changes are confined to non-static groups,也就是说这个检查对非静态Group不起作用。问题是,在哪里定义这个Group?它是non-static还是static呢?
4. 关于Unique Bundle IDs,官方文档上也是Turn on“Unique Bundle IDs”within the AddressableAssetSettings Inspector,但我没有找到。
A1:第一个问题:Addressable最终也是打包成AssetBundle,打包的存储目录由每个Group的BundledAssetGroupSchema设定的Build Path而定。对于同一个Group的资源是否打包到一个Bundle里面,也是由BundledAssetGroupSchema的Budle Mode决定的。如果是Pack Together,则会打包到一个Bundle里,Pack Separately则会将每个Entry打成一个Bundle。关于粒度问题跟使用Asset Bundle是类似的,Addressable会自动管理Bundle包的依赖关系,如果依赖的资源没在其它的Bundle包里面,则会被自动打进自身的Bundle里面。
第二个问题可以参考图片里面的做法:
感谢Xuan@UWA问答社区提供了回答A2:问题3:
Cannot Change Post Release == static
Can Change Post Release == non-static问题4:
关于更多Addressable的技术话题,可查阅UWA学堂相关课程:
《Addressable系统解析及实践经验》
《Addressable进阶实用方法》
感谢黄程@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5e649911438f7d0db495c724
Addressable
Q:请教一下Adressable如何进行热更新。在之前的项目中,所有的资源打包成AssetBundle放在StreamingAssets里,有更新的AssetBundle会下载到可写目录,游戏加载时优先加载可写目录的AssetBundle。
那么在Addressable中如何实现这个功能呢?能否设置优先读取目录?
A:不知道题主说的设置优先读取目录是指什么意思,暂时按照自己理解的意思来说一下。Addressable的资源更新功能需要在Editor和Runtime两方面处理。在Editor的部分,需要在Setting里面勾选Build Remote Catalog,第一次使用New Build后会产生Catalog文件(.hash和.json文件),这两个Catalog文件和打出来的Bundle文件需要放在服务器上。之后再进行资源更新需要Update a Previous Build来进行打包。这时候Editor会覆盖掉原来的Catalog文件(.hash和.json文件),同时会有新的Bundle文件生成,将新生成的文件替换服务器原来的文件即可。
在Runtime的部分,需要调用CheckForCatalogUpdates和UpdateCatalogs来更新资源。当资源更新到本地后,再调用Addressable.LoadAssetAsync则会自动从本地目录进行加载了,不知道这里的本地目录是不是就是题主所说的优先目录。
具体代码可以参考:
https://answer.uwa4d.com/question/5e3b7fe686a39548919837e1
感谢Xuan@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5e64aa06438f7d0db495c727
Camera
Q:做一个效果需要设置一个WorldToView矩阵,挂了一个脚本在主相机上设置了全局的变量,但是在SceneView下仍然使用的是主相机的WorldToView矩阵,有什么办法在SceneView渲染时设置SceneView的Camera的属性呢?
A:如果是想把GameView的镜头同步到SceneView,可以尝试以下方法:
[InitializeOnLoad]
public static class SyncSceneViewMenuItem {
private const string MenuName = "Tools/同步GameView镜头到SceneView";
private static bool enabled; static SyncSceneViewMenuItem() {
SyncSceneViewMenuItem.enabled = EditorPrefs.GetBool(MenuName, false);
this.Apply();
} [MenuItem(MenuName)]
public static void ToggleSync() {
SyncSceneViewMenuItem.enabled = !SyncSceneViewMenuItem.enabled;
EditorPrefs.SetBool(MenuName, SyncSceneViewMenuItem.enabled);
this.Apply();
} private void Apply() {
Menu.SetChecked(MenuName, SyncSceneViewMenuItem.enabled);
SyncSceneViewCamera.enabled= SyncSceneViewMenuItem.enabled;
}
}
public class SyncSceneViewCamera : MonoBehaviour {
#if UNITY_EDITOR
public static bool enabled;
private Camera camera;
private void Update() {
if (SyncSceneViewCamera.enabled) {
if (this.camera == null){
this.camera = Camera.main;
}
UnityEditor.SceneView.lastActiveSceneView?.AlignViewToObject(this.camera.transform);
}
}
#endif
}
感谢黄程@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d52a35f80d96a06d776dc55
Android
Q:Unity导出的Gradle项目,默认会把UnityPlayerActivity配置成SingleTask。但是实际测试中,有不少第三方SDK会冲突SingleTask的配置。
Unity使用这个默认配置是否有什么设计原因?如果修改到Standard会有一些什么陷阱?
A1:主要是为了防止游戏被启动导致二次崩溃,但是只依赖LaunchMode为SingleTask是不够的,确实会有第三方SDK强制要求按他们的来,比如腾讯渠道就要求SingleTop:
游戏的Activity的LaunchMode需要设置为SingleTop,设置为SingleTop以后在平台拉起游戏的场景下,有可能会出现游戏Activity被拉起两个的情况,所以游戏Activity的onCreate里面需要检测当前Activity是否是重复的游戏Activity,如果是则要结束当前游戏Activity。
所以两手准备比较万全,能用SingleTask的用SingleTask,不行的就用静态变量来做下判断。
感谢littlesome@UWA问答社区提供了回答A2:这个对于降低宕机数的统计有一定的贡献,很多时候你的游戏没有设置成SingleTask切换后台再次回到游戏,可能就会被重新拉起来,这就加大了你的宕机统计,对宕机率影响挺大的。
感谢李星@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5e5e1c29438f7d0db495c6b8
Resource
Q:游戏中有上百个皮肤、坐骑、翅膀等外观展示Prefab,这些Prefab的加载方式均是通过AssetBundle加载,当创建出Prefab后,会调用AssetBundle.Unload(false)来卸载掉AssetBundle,但GameObject和相应的资源还会在内存中保存着。
现在遇到的问题是:在手机上全部点开这些外观模型后,第一次调用Resources.UnloadUnusedAssets时,会产生一个可能长达20秒的卡顿。如果那些GameObject均已Destroy掉,且内存中这些相应的资源全部变成垃圾待回收了,调用Resources.UnloadUnusedAssets会卡这么长时间还可以理解,但现在问题是这些资源都还引用着,不会被这个API清理吗?有确认过不是因为其它的资源引起的,甚至AssetBundle.Unload(false)这个接口都试过屏蔽掉,相同操作下同样会产生卡顿。
请问导致这个超长卡顿可能的原因有哪些?Unity版本为2017.4.30f1。
最新进展:测试加载单个Prefab资源后(调用完AssetBundle.LoadAsset),不调用任何其它释放的接口,直接调用c,在调试日志中相关显示为:
Unloading 27 unused Assets to reduce memory usage. Loaded Objects now:6777.
Total: 20.391873 ms(FindLiveObjects: 1.497475 ms CreateObjectMapping:0.186901 ms MarkObjects: 15.905487 ms DeleteObjects: 2.801631 ms)
现在最大的问题就是:这个27是怎么来的?它是哪些资源被标记为垃圾然后删除了?
A:20秒的情况下,是否有对应的日志?看看4个步骤里哪个步骤耗时久,还有Objects是什么数量级。
你的测试代码可以改成这样试试:
yield return Resources.UnloadUnusedAssets();
yield return Resources.UnloadUnusedAssets(); // 确保这一条的输出是 Unload 0 个
var info0 = CreateIDToInfoMap(Resources.FindObjectsOfTypeAll<Object>()); // 创建一个字典,Key是InstanceID,Value是对象描述 ab.LoadAsset(); yield return Resources.UnloadUnusedAssets();
var info1 = CreateIDToInfoMap(Resources.FindObjectsOfTypeAll<Object>()); // 对比info0和info1 把描述打印出来,就可以知道少了哪些Object
感谢littlesome@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5e64e0e6438f7d0db495c72b
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)
关于Addressable的疑问的更多相关文章
- 阶段一:用Handler和Message实现计时效果及其中一些疑问
“阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 本来是打算继续做天气预报的优化的,但因为某些原因,我要先把之前做的小应用优化一下.所以今天就插播一下用Handle ...
- sys.dm_os_waiting_tasks 引发的疑问(中)
上一篇我们说了一下sys.dm_exec_requests 和 sys.dm_os_waiting_tasks 在获取并行等待的时候得不同结果,这一篇我们谈论下我的第二个疑问:为什么一个并行计划(4线 ...
- sys.dm_os_waiting_tasks 引发的疑问(上)
很多人在查看SQL语句等待的时候都是通过sys.dm_exec_requests查看,等待类型也是通过wait_type得出,sys.dm_os_waiting_tasks也可以看到session的等 ...
- 关于C#调用非托管动态库方式的性能疑问
最近的项目中,因为一些原因,需要C#调用非托管(这里为C++)的动态库.网上喜闻乐见的方式是采用静态(DllImport)方式进行调用.偶然在园子里看到可以用动态(LoadLibrary,GetPro ...
- 廖雪峰Python教程疑问
1. 字符串的strip()方法 原文: “把一个序列中的空字符串删掉,可以这么写: def not_empty(s): return s and s.strip() list(filter(not_ ...
- (转)对SQLSERVER数据库事务日志的疑问
本文转载自桦仔的博客http://www.cnblogs.com/lyhabc/archive/2013/06/10/3130856.html 对SQLSERVER数据库事务日志的疑问 摸不透SQLS ...
- 增量式PID计算公式4个疑问与理解
一开始见到PID计算公式时总是疑问为什么是那样子?为了理解那几道公式,当时将其未简化前的公式“活生生”地算了一遍,现在想来,这样的演算过程固然有助于理解,但假如一开始就带着对疑问的答案已有一定看法后再 ...
- python魔法函数的一些疑问
看了魔法函数,有一点疑问.1中需要用self.word才能执行,而2直接用self就可以执行.而1中Word继承了int基本类型,但在__new__时并没有什么卵用.当用 Word(“123”)来实例 ...
- 字符串、字符、字节以及bit位小结与疑问
字符串是由一个个字符组成的,每个字符又有一个或多个字节来表示,每个字节又由8个bit位来表示 在C#里 字符串通常由string来声明,字符由char来声明,字节由byte来表示,位由bit来表示,具 ...
随机推荐
- fare|gave it away|catch a glimpse |involve|rip|eternalstiff|
N-COUNT 旅费;路费;车费A fare is the money that you pay for a journey that you make, for example, in a bus, ...
- [LC] 235. Lowest Common Ancestor of a Binary Search Tree
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...
- 吴裕雄--天生自然HTML学习笔记:HTML 链接
HTML 链接 HTML 使用超级链接与网络上的另一个文档相连.几乎可以在所有的网页中找到链接.点击链接可以从一张页面跳转到另一张页面. HTML 超链接(链接) HTML使用标签 <a> ...
- 国产ROM纷争升级 能否诞生终结者?
能否诞生终结者?" title="国产ROM纷争升级 能否诞生终结者?"> 相比iOS系统的低硬件高流畅,安卓系统就显得"逼格"低了许多.先不说 ...
- PHP 错误与异常的日志记录
提到 Nginx + PHP 服务的错误日志,我们通常能想到的有 Nginx 的 access 日志.error 日志以及 PHP 的 error 日志.虽然看起来是个很简单的问题,但里面其实又牵扯到 ...
- MySQL安装和常用命令
一.安装MySQL groupadd mysqluseradd -r -g mysql mysqlgroups mysqlfind / -name mysql | xargs rm -rfwget h ...
- Kubernetes集群部署DNS插件
准备 kube-dns 相关镜像 准备 kube-dns 相关 yaml 文件 系统预定义的 RoleBinding 配置 kube-dns 相关服务 检查 kube-dns 功能 kube-dns ...
- Spring MVC知识梳理
同上一篇博客,复习梳理SpringMVC知识点,这次的梳理比较快,很多细节没有顾虑到,后期可能会回来补充 1. 整体架构 1.1 在学习了SSM框架后我们来理清三者的应用层面 浏览器发送请求,请求到达 ...
- Python左手画条龙右手画个彩虹
左手画龙右手画彩虹听说很火,Python也可以画出很美的彩虹,准确的说像彩虹棒棒糖:) 效果如下图: # -*- coding: utf-8 -*- # @Time : 2019/12/16 23:2 ...
- python安装pip (windows64)
1.前提条件是先安装了easy_install(easy_install安装教程http://www.cnblogs.com/IT-Crowd/articles/6528469.html) 2.在ea ...


