资源管理

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. 服务器怎么设置网站写入权限,如何设置服务器写入权限设置方法
  2. 语音识别2:CTC对齐的算法
  3. mysql免安装如何改密码_mysql免安装版配置与修改密码的教程
  4. 判断linux进程是否存在
  5. 线程等待通知 linux,Java 线程协作 wait(等待)与 notiy(通知)
  6. php相关知识,PHP的基础知识简单介绍
  7. 学生HTML5今后的打算,今后我打算小学生日记
  8. poj1273:Drainage Ditches
  9. UnityWebPlayer打开文件
  10. 离散数学及其应用第六版中文电子书和答案
  11. 4G路由器光伏发电监控系统
  12. CentOS 7 安装教程、硬盘分区、LVM、网络配置、软件源配置、制作
  13. 计算机网络结构示意图,常用的计算机网络拓扑结构
  14. 回国后无线网safari无法连接服务器,解决Mac能连上WIFI但无法上网的问题
  15. c语言中字母与allse,几读音是什么
  16. 毕生精力总结的电脑技巧
  17. leveldb Arena 分析
  18. Windows10下的WSL的使用和ssh配置
  19. 在群辉上搭建git服务器
  20. Simcenter Amesim 2019.2与Matlab 2019b联合仿真-环境配置与例程联合仿真

热门文章

  1. ARM汇编:乘法指令集
  2. linux下挂载和卸载的命令的用法:mount 、umount
  3. 安装使用vmware及vsphere流程介绍
  4. 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用
  5. ubuntu安装使用ffmpeg
  6. Uva(10048),最短路Floyd
  7. 【JavaScript】document对象属性
  8. 避免button处理事件过程中 点击按钮触发事件的方法
  9. 从李小龙的一句话看程序员是否应该多学几种编程语言
  10. Linux命令整理 - 文件搜索【4】