1)Timeline技能编辑器如何提取关键帧信息
2)Mesh资源开启R/W内存的翻倍问题
3)UI的Animator动画对Canvas.SendWillRenderCanvas()耗时影响
4)对Shader变体的理解
这是第281篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
Script
Q:最近在用Unity做一个技能编辑器,让策划可以在Timeline编辑器里编辑技能动画、施法特效、受击动画、受击特效和播放声音等等。编辑这些都没什么问题,我想根据编辑好的Timeline导出一系列行为节点,在Editor的环境下导出成配置(包含所有行为节点)。现在我不清楚怎么获取Timeline里第m帧开始某动画x,第n帧结束这些行为。同时怎么能给动画打上对应Tag?
A:Timeline的组成如下图:
每个Track对应一个TrackAsset其实就是一个PlayableAsset,整个Timeline也是一个TimelineAsset,里面存了所有Track的数据:
对于每个Clip的开始和结束时间在TimelineClip中可以获取:
感谢羽飞@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/61c00a17d8413e18eb546b3b
Mesh
Q:为什么Profiler中显示开启网格的Read/Write没有使其内存翻倍,而仅仅是上升了一点?
A:如果是FBX中的网格资源,则该网格资源很有可能除了自身网格的顶点数据外,还带有动画和骨骼信息。而当开启FBX的Read/Write时,仅会使网格资源自身的内存翻倍,而动画和骨骼信息不会,且Profiler并不能将他们分开统计,从而产生了整体没有翻倍的现象,如图。
开启Read/Write:
没开Read/Write:
这一点可以通过将FBX设置中Animation Type设置为None、取消Import Animation勾选、取消Import Materials勾选证明。此时Profiler中该网格资源内存显著下降,并基本符合开启Read/Write前后内存翻倍了。
值得一提的是,在较新版本的Unity中(图截自2020.3),选中网格资源是可以看到其内存的理论大小和具体组成部分的。
感谢Faust@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/61c05c15d8413e18eb54ec09
UGUI
Q:对UGUI添加Animator动画会造成UI更新耗时吗?如果Animator组件处于Active状态但没有进行Loop会有持续耗时吗?
A:在Unity 2018.4版本中对于这个问题实验如下:
步骤1,场景中为一个UI添加修改Scale的动画,并复制1000个;
步骤2,添加了其Position和Color属性的动画;
步骤3,修改了所在Canvas的Render Mode为Overlay模式和Camera模式;
步骤4,修改了所在Canvas的Pixel Perfect为打开。
只进行1的情况下无论动画是否Loop,Canvas.SendWillRenderCanvas()都只会在刚开始时有一段高耗时。
而修改2之后的所有情况下,开启Loop时Canvas.SendWillRenderCanvas()始终具有高耗时。但关闭Loop后,播放完一次动画后Canvas.SendWillRenderCanvas()的耗时就始终接近于0了,如图:
而此时动画系统本身的Animator.Update()耗时仍然很高,如图:
总的来说,从2018.4上的这次实验来看,现版本的UGUI不会被不在播放状态的Animator影响而造成Canvas.SendWillRenderCanvas()耗时。
感谢Faust@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/61c05b07d8413e18eb54ea3e
Shader
Q:除了不建议使用Standard Shader外,还有其他的Unity默认的Shader不推荐使用吗?比如官方的Universal Render Pipeline/Particles/Unlit有6个变体,其中也用到了雾效的计算。但是我们项目中没有用到雾效,而且这个Shader用得非常多,这类情况是否有必要自己弄一个简洁版?
A:关于Shader变体数量主要影响的是Shader的内存(虽然变体数量和内存并不是完全的线性关系),如下PPS中的Uber变体数为3.74K很高:
主要是因为有很多multi_compile的Keywords,建议手动删除一些不用的(或使用shader_feature代替),可以大大降低变体数量:
以上示例就是简单粗暴的优化对内存影响较大的Shader,当然最好是通过SVC对项目中所有Shader的所有变体进行管理,但工作量相对会大很多。
感谢羽飞@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/61c672c1d8413e18eb5db606
封面图来源于
Animation Rigging: Advanced Setups
展示了Unity动画索具包的高级设置和用例。
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)