资源管理

Q1:对于WWW.LoadFromCacheOrDownload(System.String url, Int32 version)这个接口的第二个参数,我知道是做缓存资源的更新用的。我们之前在Editor模式下作了一个测试:用该函数加载一个资源,Version参数设置为1,会发现在缓存目录下生成了一个对应该资源的缓存目录,这很正常。然后我们再次用这个接口加载这个资源,Version参数设置为2,现会发在缓存目录下生成一个新的对应该资源的缓存目录,并没有覆盖旧的目录。这个情况在移动平台上是否也是这样的?

是的,在移动平台上,通过LoadFromCacheOrDownload加载的AssetBundle,其Version版本号变化时,新的解压Data是不会覆盖旧的解压Data的。清除旧的解压Data主要有三种方式:

  1. 设置缓存的过期日期,默认情况下是150天;
  2. 调用Caching.CleanCache来全部清空缓存;
  3. 当本地Cache已满时,Unity会从最早的AssetBundle来进行自动清理。

此问答来自于UWA 问答社区:
https://answer.uwa4d.com/question/58ec4adfda71c21b3b1ac91f
如您对该问题仍有疑问,可以转至社区进行进一步交流。


资源管理

Q2:我听说WWW.LoadFromCacheOrDownload(System.String url, Int32 version)这个接口加载资源,如果是Unity 4.x的版本,会有500个资源的数量限制,如果超过这个限制,Unity会删除之前缓存的每个资源,是这样吗?那在Unity 5.x 版本上是否还存在这样的问题呢?

在Unity 4.x的版本中,如果通过LoadFromCacheOrDownload来加载AssetBundle,那么有两种情况需要考虑:

  1. 内存中加载的AssetBundle数量。在iOS平台上,通过该接口加载、同时存在于内存中的AssetBundle数量确实是有限的,接近300个,这是由于iOS上文件句柄数的限制导致。而该限制在Unity 5.0以后则被完善了,因为Unity 5引入了虚拟文件系统,所以不再有这个限制;在Android平台上,则没有这个限制,或者说数量限制值非常大,基本可以忽略。

  2. 本地Cache中缓存的AsseBundle数量。无论是iOS、Android还是PC版本,都没有500的数量限制,而是有一个硬盘占用大小限制。具体来说,在WebPlayer平台上,有50MB的缓存限制,而在其他平台上,则是4GB的缓存限制。所以只要硬盘占用大小不超过限定值即可。

此问答来自于UWA 问答社区:
https://answer.uwa4d.com/question/58ec4807da71c21b3b1ac91c
如您对该问题仍有疑问,可以转至社区进行进一步交流。


资源管理

Q3:我阅读了UWA的你应该知道的AssetBundle管理机制一文,想对其中“每次加载都涉及到解压操作”的理解进行确认:对于new WWW实际是解压到WebStream。而如果是用的LoadFromCacheOrDownload,那么资源是在磁盘,所以在调用www.assetbundle时才做解压。那么有个问题,如果使用直接获取AssetBundle的那些API,解压过程是怎样的呢?CreateFromFile是在调用assetbundle.load的时候从磁盘解压,CreateFromMemory是直接解压到WebStream?

另外,对于WebStream来说,同一个WWW对象多次调用www.assetbundle方法时,得到了栈上的多个变量,但是这些变量都指向同一个WebStream中的对象吗?

对于第一个问题,AssetBundle的解压均发生在加载API的调用处,而不发生在www.assetbundle时,即无论是New WWW、LoadFromCacheOrDownload、LoadFromFile还是LoadFromMemory,其AssetBundle的解压均在上述API调用处。在Unity 5.3版本之前,Create/LoadFromMemory是直接解压到WebStream中,而在5.3后,则已经不存在WebStream这一说法了。具体可以查看官方文档:https://docs.unity3d.com/Manual/AssetBundleCompression.html

对于第二个问题,同一个WWW对象,多次调用www.assetbundle时并不出现WebStream的Clone操作,即这些变量均指向同一WebStream对象。


动画模块

Q4:我们在内存优化时发现一个问题,编辑器版本 Unity 5.3.4p6,使用UGUI,场景A中一个Text控件使用自定义字体资源,然后把该控件Text属性勾选为空(disable),再Load一个空场景,看场景A卸载后在内存中的残留,发现有一份引用是 ManagedStaticRefrences()的 Font 内存。如果不是把Text属性disable,则场景A卸载后内存里不会再残留被引用的Font内存,请问可能是什么原因造成的呢?相关例子已经提交给UWA。

UWA对于该例子进行了检测,的确能够在 Editor 复现。查了下 UGUI 代码,能对 Font 产生引用的,主要是这个函数 FontUpdateTracker.TrackText(Text),其中会把 t.font 引用起来;而对应的解引用的函数为 FontUpdateTracker.UntrackText。因此,如果出现了两者的调用不匹配,就有可能造成 font 的 ManagedStaticRefrences 引用。

进一步查看后,可以看到在定义了 UNITY_EDITOR 宏时,UI 元素会增加一个名为 OnValidate 的函数,Text 组件则在其中进行了 TrackText 的操作。
而最关键的是,该函数在 Text 组件以“未激活”的状态被实例化时同样会被触发,同时,如果这样的 Text 组件在后续没有被激活过就被销毁,其 OnDestroy 和 OnDisable 函数是不会被调用的,参见文档中的这句话:OnDestroy will only be called on game objects that have previously been active.
而 OnDisable 中才会调用 Untrack 解引用,所以造成了不匹配,导致了 font 的 ManagedStaticRefrences。
但是,OnValidate 函数只在 Editor 上才有,真机上不会发生上面说到的不匹配的情况。所以建议研发团队先在真机上测试下是否还有这种情况,如果确实没有,那么就忽略该问题即可。

此问答来自于UWA 问答社区:
https://answer.uwa4d.com/question/58e4e793e042a5c92c3484e1
如您对该问题仍有疑问,可以转至社区进行进一步交流。


图形渲染

Q5:我想了解如何使用顶点色Mask控制明暗关系,才能达到类似崩坏琪亚娜效果?

贴一个之前Guilty Gear Xrd (http://qiankanglai.me/2015/10/09/ggx-part1)的例子,参考了 【翻译】西川善司「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密—前篇(1)(http://www.cnblogs.com/TracePlus/p/4205798.html) 中的做法:

研发团队可以在顶点色里刷入明暗信息,如下图:

原来的效果如下:

接下来把顶点色的明暗乘上去(或者用其他的运算,主要就是用来控制亮度)

注意左臂腋窝部分…阴影部分变大了。至于具体的控制方法,个人认为一般点乘居多,美术只要控制好顶点色输入的亮度就行。

感谢来自 UWA 问答社区的钱康来提供回答:
https://answer.uwa4d.com/question/58e5ffe180ca640f2736fc94
如您对该问题仍有疑问,可以转至社区进行进一步交流。


原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

技术分享连载(六十)相关推荐

  1. 技术分享连载(十八)

    图形渲染 Q1:我看到Unity 5.3.5版本中恢复了对粒子系统的合批功能,但是我尝试下来并没有达到这个效果.是粒子系统合批有什么要求吗,实例化会不会对粒子系统的合批造成影响呢? 经过我们验证,Un ...

  2. UWA 技术分享连载 转载

    技术分享连载1 Q1:Texture占用内存总是双倍,这个是我们自己的问题,还是Unity引擎的机制? Q2:我现在发现两个因素直接影响Overhead,一个是Shader的复杂度,一个是空Updat ...

  3. DockOne微信分享(六十四):基于Docker实现DevOps的一些探索

    本文讲的是DockOne微信分享(六十四):基于Docker实现DevOps的一些探索[编者的话]本次分享从DevOps介绍:Docker介绍:基于Docker实现DevOps的优势:Docker化D ...

  4. DockOne微信分享(六十九):微服务选型之Modern Node.js

    本文讲的是DockOne微信分享(六十九):微服务选型之Modern Node.js[编者的话]目前Node.js的发展非常快,大家可能还停留在:Node.js性能很好,Node.js里都是回调,写起 ...

  5. 技术分享连载(六十九)

    资源管理 Q1: 在打包的时候,有一部分资源是没有设置AssetBundleName的,打包的时候会和依赖它们的资源打到同一个AssetBundle包里(Unity自动完成).在资源加载的时候,无法主 ...

  6. 技术分享连载(六十四)

    资源管理 Q:Unity 5 的 Shader Variant Collection 功能是否推荐使用?我有以下3个疑点: 1)使用 Shader 变体之后,Shader 是否还能走资源更新?抑或 S ...

  7. 技术分享连载(六十八)

    性能 Q1:Unity Profiler中如下函数的耗时异常高,请问是什么原因导致呢? 1)Profiler.FinalizeAndSendFrame 2)WaitForJobGroup 3)Came ...

  8. 技术分享连载(八十六)

    加载 Q1:在手机上测试LoadLevelAsync和LoadLevel的加载速度,同一个场景,LoadLevelAsync要比LoadLevel多花费40%左右的时间,请问这是正常的么?LoadLe ...

  9. 技术分享连载(七十六)

    性能优化 Q1:Unity对GameObject.active()这个底层具体做了什么?因为在优化项目的时候看见有些界面active()这个函数造成的开销比较高,我采取的办法是移除摄像机的范围,这是参 ...

最新文章

  1. Print All JVM Flags
  2. C++coin change 硬币找零(附完整源码)
  3. java 键入_在Java中键入Safe SQL
  4. php手册学习怎样,PHP新手之如何学习PHP的讲解
  5. 112654 个招聘数据告诉你,程序员 2019 年该去哪!
  6. 【转】ZooKeeper学习第二期--Zookeeper命令操作
  7. sql中去掉字段的所有空格
  8. IS-IS详解(十一)——IS-IS 区域间防路由环路和次优路径
  9. 计算机脚本发生错误,我的电脑开机后显示当前页面的脚本发生错误?
  10. 2020春节假期延长至正月初九(2月2日)
  11. 华为安全 HCIP722笔记
  12. 软件工程毕业设计课题(78)微信小程序毕业设计PHP校园食堂就餐预约小程序系统设计与实现
  13. 1.2 二维三维空间向量组的线性组合
  14. 2018普通话水平测试软件,2018年 普通话测试 照片要求
  15. python中的filter(),map(),reduc…
  16. Unity3D代码混淆
  17. MATLAB打开nc文件并读取nc文件数据
  18. 将自动获取IP改为固定IP
  19. 关于碧螺春的江湖之三 【苏州 碧螺春 营养成分 健康价值】
  20. 简单的echarts安装教程

热门文章

  1. python六十五:描述符(__get__, __set__, __delete__)
  2. 专访阿里云MVP王俊杰:开发者的超能力是用技术让世界更美好
  3. 互联网分布式架构--演进过程
  4. Codeforces 861 B Which floor? 思维
  5. ubuntu 启动器
  6. 【Maven3教程】Maven多工程、多模块
  7. java中关于try、catch、finally中的细节分析
  8. MyEclipse CI 2018.8.0正式发布(附下载)
  9. Java实现链表结构的具体代码
  10. hessian原理解析二(服务端分析)