Unity技术分享88-耗时分析、修改材质球、加载资源

我们将从日常技术交流中精选若干个开发相关的问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。

UI

Q1:在UI中,有两个字体控件每帧都要显示不同的数字,第一个有8个字,第二个有6~7个字,需要开outline增加辨识度,从而引起了较高的性能开销。 把这两个控件单独放到另外独立的Canvas,该问题依然存在。现已确定该开销是由这两个字体控件每帧的文本更改引起的。 下图是UI布局:

下面是引起的开销截图:

评论提到一个是8个字,一个是6到7个字,都开启了outline。 首先建议再做一次确认,看是不是禁用这两个之后,SendWill就确实没开销了。因为这个字数看上去并不应该造成很明显的开销;

其次,如果确实是这两个造成的,那么就需要先考虑下能不能转成带outline效果的静态字体,不行的话再考虑下能不能降低更新的频率了,是不是确实要每帧都变;

如果要再降低,就只能考虑静态字体了,如果文本是一些比较固定的内容就很好处理,但如果是像聊天一样,内容无法预知的话似乎就没什么办法了。或者就是低端机用shadow来做。

该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。

https://answer.uwa4d.com/question/5a1685a335b1f0ea7d4a7a71

物理

Q2:我的游戏场景中有一个boxcollider2D,位置在(0.0f,0.0f) 到 (1.0f,1.0f);调用Physics2D.BoxCast(new Vector2(1.0f,1.702), Vector2(1.0f, 1.4f), 0, Vector2(0.0f,1.0f), 2.0f); 会产生碰撞,理论上碰撞的边界在1.700 ,我已经将位置放到1.702,应该是规避了浮点数误差的问题的,如果我将该值放大了1.706就不会产生碰撞了,请问哪里可以调整这个误差值的范围呢?

Unity 2017.1版本的Physics2DSettings里面有一个Default Contact Offset,表示当两个collider之间的距离小于它们的ContactOffset之和就会产生碰撞。把这个值设置小一点应该能解决题主的问题,如下图所示:

Unity 5.x中Contact Offset,默认是0.01,这也是为何1.702不行,而1.706可以的原因。

该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。

https://answer.uwa4d.com/question/5a1672b235b1f0ea7d4a7a70

渲染

Q3:UWA有篇文章推荐了使用MaterialPropertyBlock的方式来操作Material属性,能够提升效率。原文如下:使用MaterialPropertyBlock来替换Material属性操作,在查阅 ShaderLab: Properties文档(https://docs.unity3d.com/Manual/SL-Properties.html)的时候,提到:

[PerRendererData] - indicates that a texture property will be coming from per-renderer data in the form of a MaterialPropertyBlock. Material inspector changes the texture slot UI for these properties.

那么问题来了,Shader参数用不用[PerRendererData] 来描述,对MaterialPropertyBlock操作到底有没有什么影响?我测试了用和不用2种情况,显示效果上都是正常的。

理论上[PerRendererData]只是修改Editor的显示行为的。当题主通过MaterialPropertyBlock改变了某个Material的Texture之后,只有加上了这个,才能在预览对应的Material面板上看到这个新Texture。

下图1表示在没有PerRendererData时,Editor下和Runtime时的显示内容;而图2和图3分别是加了PerRendererData后,Editor下和Runtime时的显示。

图1

图2

图3

该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。

https://answer.uwa4d.com/question/5a13f080a92f435f5e27cef3

加载

Q4:现在用Resources.Load()加载资源时,UI动画会出现卡顿的现象,如果想消除卡顿,是不是只能通过异步加载,分拆Prefab和优化材质网格动画之类的操作来实现?还是说UI动画可以在另外的线程播放之类呢?另外我想问下,异步速度是不是一定比同步慢呢?

异步加载可以缓解同步加载的卡顿,但是还是一样会卡,可以查看这个问题帖子中的说明。建议题主尝试进行资源分拆,不要同一时刻进行加载,如果不是及时显示的UI或其他GameObject,可以尝试将部分耗时资源(Atlas、Shadder等)进行预加载,如果是及时显示的UI的,那么异步加载并不能满足这个需求,也就无需考虑了;

异步速度也不一定百分百比同步慢,只能说一般情况下是如此;但具体慢多少,需要看加载的资源类型、资源量。

该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。

https://answer.uwa4d.com/question/5a13c4baa92f435f5e27ceec

动画

Q5:游戏对战时因为会频繁更换武器或释放技能(主要是网络玩家),会替换不同的动作,但是发现每次设置animatorOverride[name]=clip(每次设置3-6个),CPU占用50-180ms,请问这是什么原因?我按照官方的指导存了一个list(https://docs.unity3d.com/ScriptReference/AnimatorOverrideController.ApplyOverrides.html),然后每次LateUpdate的时候调用ApplyOverrides,发现占用更高了,每次400ms,请问这个要怎么解决?目前每个网络玩家玩家OverRidesCount是73,会不会是Clip过多的原因?

我们在真机运行时发现animatorOverride[name]=clip的耗时会受到animatorcotrollor中的clip数目的影响,随数目的增多耗时会明显增加,70个以上的clip耗时确实能达到50ms(红米note2)以上。但换为applyOverrides方法时耗时仍然很高,而且出现了堆内存分配,但并没有达到400ms那么高。 另外,这边尝试了整体替换AnimatorOverrideController,即不在现用的AnimatorOverrideController中替换clip,而是在另一OverrideController中换好clip后,再整体替换到runtimeAnimatorController,这样耗时就会降到很低了。

该问题来自UWA问答社区,感谢Saber提供了回答,如您对该问题仍有疑问,可以转至社区进行进一步交流。

https://answer.uwa4d.com/question/5a16904135b1f0ea7d4a7a72

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180328A0FTV900?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券