Q&A——资源管理(十)

资源管理

Q1:关于定位游戏中冗余资源引用的问题。UWA的报告中能定位到具体的引用代码么? 在Profiler只能看到ManagedStaticReferences但是具体不到引用的位置。比如Static ClassA引用一个ClassB,ClassB上引用了一个资源,就定位不出这个引用的过程。请问这种情况下有没有比较好的方法找到引用关系呢?

该问题在Unity 5.3 之前的版本中都没有方式来进行定位,只能由研发团队根据对代码的推测了进行定位;而在Unity 5.3之后的版本则可以借助Memory Profiler来尝试定位,而Memory Profiler尚未原生集成在Unity Editor中,需要在以下网址进行下载:
https://bitbucket.org/Unity-Technologies/memoryprofiler

资源管理

Q2:Spine动画在NGUI的ScrollView滚动区域的层级也会出现问题,请问怎么裁剪Spine动画呢,Spine是骨骼,这不就等于给特效换Shader了吗?

对于ScrollView中的Spine动画,本质上和粒子系统是一样的,也需要对其Shader进行修改,加入Alpha裁剪的实现,并从脚本中将裁剪区域传入即可。

资源管理

Q3:我们图标现在是制作成图集后再使用的,但是当图标数量很多的时候,图集的膨胀就很厉害了。对此我们的做法有两种:1)拆为多个图集;2)不再使用图集转而使用UITexture来使用。请问UWA有什么建议呢?

使用图集的主要缺点在于内存较大,且管理不便;而使用UITexture的主要缺点在于产生的Draw Call较多(每个UITexture都会产生一个Draw Call且无法拼合),影响运行效率。因此,如果同时出现在屏幕上的图标不多,即UITexture所产生的Draw Call数量不大时,可以考虑直接使用;但如果图标数量较多,且目前项目的Draw Call已经较高,那么我们依然建议继续使用图集,按照一定的规则拆分为若干组,从而将 Draw Call控制在较低的范围内。

资源管理

Q4:粒子系统的Prewarm主要用来做什么的,这个怎么优化呢?

0.png

ParticleSystem.Prewarm的出现表示当前加载、激活或者首次渲染的粒子系统开启了"Prewarm"选项,而开启该选项的粒子系统在加载后会立即执行一次完整的模拟。以“火焰”为例,Prewarm开启时,加载后第一帧即能看到“大火”,而不是从“火苗”开始逐渐变大。但Prewarm的操作通常都有一定的耗时,建议在可以不用的情况下,将其关闭。

资源管理

Q5:我们为了降低像素填充就限制了最大分辨率,但是发现限制之后NGUI的字体显示就变得模糊了。是否可以避免NGUI字体模糊呢?下图是我们在小米5上测试得到的结果:低分辨率下文字就模糊了。

请输入图片描述
请输入图片描述

从开发团队提供的图片上看,小米5上的低分辨率用的是983x552,相当于将原来的画面的四分之一分辨率。此时,降低分辨率的做法可以理解为把983x552的纹理拉伸后贴到1920x1080的屏幕上,而“贴”的过程还会涉及到重新采样,因此造成模糊是正常的,而不仅仅是文本。只是文本的边缘对比度较高,拉伸后变糊的现象会更加明显。

我们建议尝试通过RenderTexture来控制不同内容的分辨率,对于UI部分尽量不要把分辨率降得太低。

资源管理

Q6:我们有了解到,卸载AssetBundle后, 从这个AB读出资源的Instance ID和guid的映射关系会被删除。在我们的项目中, 优化策略是这样的: 进场景时, 预加载Prefab,并创建一些对象实例缓存,然后会把AB删掉。因为我们发现在Android机器上, AB占的内存很大, 如果其中纹理(A)的Instance ID被认为失效,它和guid的映射没有了,如果某个时刻,缓存池不够用,需要从Prefab创建一个新的实例,这个Prefab会引用到A,资源管理器发现这个A的guid并没有对应的实例ID, 这时会导致重新从磁盘上加载资源A,请问这样理解对吗?

Instance ID和"guid"(类似Editor中的guid,但本质上不是)的映射是在发生加载操作时才需要的,如果一个Prefab需要的资源都已经加载好了(通常第一次实例化就都加载好了),那么后续的多次实例化都是不需要那层映射关系了的。所以理论上这种情况下卸载AB是没问题的。另外,Unity是不会自动"从磁盘上重新加载A"的,对于AB中加载出来的资源,"磁盘"就是指内存中的ab文件,如果AB已经卸载了,那么重新加载的结果就是资源丢失。发生冗余的前提是,这个AB又被手动加载进内存。


资源管理

Q7:UWA的测评报告上说“蒙皮网格(Skinned Mesh)数量过高”,我们游戏内很多模型动画用的是这个,是美术还可以用其他的方式做动画吗?

http://blog.uwa4d.com/archives/Simple_PA_Animation.html

随着研发项目越来越重点,蒙皮网格数量必然会越来越多。报告中“蒙皮网格过量”仅是一个提醒,它在性能方面最主要的影响其实是MeshSkinning.Update和Animation.Update/Animator.Update,建议这个研发团队在看到“蒙皮网格数量过多”提醒时,重点看一下动画系统性能页面中的CPU耗时是否较高。如果较高,则建议根据我们动画模块优化Blog中的建议去完善项目动画模块即可。


资源管理

Q8:能否推荐一些动画剧情的插件?

我们推荐Asset Store中的uSequencer插件。具体的相关文章可参见:
1)Usequencer 初识
2)Usequencer 准确显示瞬时事件&持续事件

资源管理

Q9:请教一下,为什么NGUI的Atlas通过AssetBudle载入之后,使用Resources.UnloadUnusedAssets()不能够释放呢?分析器里面引用是1,但是又找不到哪里引用了。

如果Unity Profiler中看到了资源的引用计数不为0,则说明该Atlas资源还在被索引,这样使用Resources.UnloadUnusedAssets()是无法进行卸载的。只有将其索引消除,该资源才会被认为是UnUsed资源,这样才能被Resources.UnloadUnusedAssets()卸载。该资源的引用计数不为0的原因可能有以下几种:

(1)它被缓存在某些Container中,即它从AssetBundle或Resources中加载后,被直接缓存到某个容器中,从而产生了索引,只要它没有被清除出容器,那么索引将一直存在;

(2)它被其他Material、Prefab等索引,而这些资源被缓存在某些容器中,即间接被容器缓存,只要索引它的资源不被清楚,那么它的索引页将一直存在。

就目前我们遇到的泄露问题来看,上述两点为最为主要的原因。因此,如果你的项目中也存在类似情况,建议首先以此为基础对容器的使用进行排查。

资源管理

Q10:对于NGUI而言,如果界面元素的坐标是非整数的数值,会导致界面元素模糊么?还有哪些原因会造成界面元素模糊?

导致界面元素模糊的原因主要分为两个,一是像素未对齐(通常就是因为坐标非整数造成),在相邻像素色差较大的情况下容易出现模糊,特别是文字部分;二是纹理分辨率相对于屏幕的分辨率被缩小或放大,纹理被缩小通常会表现出锯齿感,而纹理被放大则会表现出模糊。

而对于动态字体,通常只需要确保像素对齐即可使其不模糊,但需要注意的是,UGUI与NGUI都有全局缩放的功能(分别在Canvas Scaler和UIRoot组件上),是为了确保不同分辨率下布局相同,也会使动态字体出现缩放,从而造成模糊的问题。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值