技术分享连载(二十五)

技术分享连载(二十五)

本期话题:相同内容且仅是整体颜色不同资源如何打包、onTransformChanged优化、Static Collider.Move(Expensive delay cost)优化...这是侑虎科技第70篇原创文章,欢迎转发分享,未经作者授权请勿转载。同时如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。

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


资源管理

Q1:Unity中的SerializedFile是怎么产生的?请问用Unload(false)可以清除吗?因为读取了Bundle里面的内容后已经赋值给其他物体了。而且我把图片都打成了Bundle,然后读取出来,图片的大小应该是超过了这个SerializedFile的大小的?
UWA Tech Doc

SerializedFile是AssetBundle加载时产生的序列化信息,一般为LoadFromCacheOrDownload、LoadFromFile和New WWW加载本地AssetBundle文件所致。如果AssetBundle中的资源已经加载,且后续没有依赖该AssetBundle的资源进行加载,那么可以通过Unload(false)将其删除。SerializedFile中记录的是AssetBundle的序列化信息,而不是其包含资源的内容,因此,其大小要小于或远小于资源的实际内存。


资源管理

Q2:我游戏里重复的特效较多,有些只是图案相同但改变了颜色参数,如果都打成独立AssetBundle,则内存里面会有多份Texture。关于这样的打包一般有什么推荐的方法呢?

如果是相同内容且仅是整体颜色不同的话,那么建议项目中只保留一份初始纹理资源,并通过Shader在运行时改变其整体配色,从而达到不同的效果。但如果是局部配色不同,那么可以在原始纹理的基础上加一种或几种Mask纹理,用来负责颜色的自适应调配,然后再通过Shader来达到不同的展示效果。


资源管理

Q3:我发现ScrollRect里有大量元素,在拖动的时候触发了很多onTransformChanged,能否提供一些优化思路?

OnTransformChanged是UI元素在移动时触发的,所以该回调的开销是不可避免的,但一般来说该回调本身耗时并不会太高。因此,当OnTransformChanged耗时很高时,有三种方式进行优化:

  1. 可以先查看是否有哪个或者哪些子函数占比较高,比如,当OnTransformChanged触发了OnDimensionChanged时,耗时会明显升高,而OnDimensionChanged则是在开启了Canvas的Pixel Perfect时才会出现的。那么就可以考虑是否在拖动时暂时关闭Pixel Perfect。

  2. 如果主要是其自身开销造成,那么很可能就是因为移动的UI元素数量太大引起的。那么就可以从策略上减少UI元素数量,比如,做成拖动翻页的界面,一次性只需移动两页的UI元素等。

  3. 如果使用的是Mask组件,那么可以尝试改为Rect Mask 2D组件,同样会有性能上的提升。


资源管理

Q4:是否有办法用RenderTexture直接生成PVRTC或者ETC格式的Texture2D贴图?

目前在Unity引擎中没有办法生成PVRTC或ETC格式的RenderTexture。RenderTexture具有固定的使用格式,可参考以下链接:
https://docs.unity3d.com/ScriptReference/RenderTextureFormat.html


物理性能

Q5:有时候在Profiler中会碰到Static Collider.Move(Expensive delay cost),有什么办法可以优化掉呢?

一般情况下,尽可能避免在Unity Profiler中出现 Static Collider.Move(Expensive delayed cost)字样。这种字符的出现很可能会导致后续的物理更新出现较大的性能开销,具体体现在Physics.Simulate中。出现这种情况主要是受限于Unity 4.x版本中的PhysX 2.x在移动静态碰撞体是开销较高的问题。因此,我们建议给需要移动的静态Collider加上RigidBody并勾选is Kinematic复选框,从而将其变为动态碰撞体。进行此操作后,该字样将会随之消失。


【技术分享】是UWA推出的技术交流栏目,我们会定期将开发团队中反馈的常见问题加以总结并梳理在此,以供大家参考。