技术分享连载(八十八)

技术分享连载(八十八)

本期我们聚集了这些话题:同步/异步加载资源、Physics2D碰撞浮点数、SendWillRenderCanvas开销...


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

UWA QQ群:793972859
UWA 问答社区:answer.uwa4d.com


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


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站(answer.uwa4d.com)上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
官方技术QQ群:793972859(仅限技术交流)