UGUI(2) 减少DrawCall
一、动态合批
- 要求相同材质,图集
- 注意sprite穿插,影响合批。
为什么sprite层级会影响合批?
这关联到渲染顺序。UI元素的默认Render Queue是3000 (UI-Default.shader),即
"Queue"="Transparent"
,半透明对象,没有开启深度写入ZWrite Off
,要得到正确的的渲染效果,就必须从后向前渲染(相对于相机)。
若sprite穿插,只能从后向前渲染,无法合批成1次渲染。
UI元素的默认Render Queue.png
UI-Default.shader节选:
SubShader { Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" "CanUseSpriteAtlas"="True" } ... ZWrite Off ZTest [unity_GUIZTestMode] ... }
Masking is implemented using the stencil buffer of the GPU.
二、空Sprite响应点击,替代透明Image,无DrawCall方案
使用透明Image作为响应点击的Graphic会增加一个DrawCall,如何实现一个无DrawCall方案呢?
关键有2点:
- 继承Graphic,override OnPopulateMesh方法
toFill.Clear();
。 - 实现ICanvasRaycastFilter,将 Raycast Target置为true,这样才能响应点击。
示例:
public class XXX: Graphic, ICanvasRaycastFilter { protected override void Awake() { base.Awake(); color = new Color(1.0f, 1.0f, 1.0f, 0.0f); } protected override void OnPopulateMesh(VertexHelper toFill) { toFill.Clear(); } public virtual bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera) { return true; } }
三、圆形或多边形图片,替代Mask,无DrawCall方案
与上面空sprite原理类似,都是对OnPopulateMesh方法的重写
- 改写入圆形顶点数据–已知半径;
- 设置uv等信息;
原文地址:https://www.jianshu.com/p/39b3702eb4f3
相关推荐
-
.NET Core 获取自定义配置文件信息 C#
2019-5-15
-
200 行代码使用 C# 实现区块链 C#
2019-5-23
-
EntityFramework之监听者判断SQL性能指标 C#
2019-5-12
-
unity协程coroutine浅析 C#
2019-6-26
-
.NET Core微服务系列基础文章索引(目录导航Final版),基于Steeltoe集成Spring Cloud Zuul实现统一API网关 C#
2019-5-10
-
ASP.NET Core Web API 版本控制 C#
2019-7-2
-
Unity切换后台回调函数 C#
2019-8-30
-
EntityFramework Core映射关系详解 C#
2019-5-12
-
.NET CORE 多语言实现方案 C#
2019-9-18
-
结合异步模型,再次总结Netty多线程编码最佳实践 C#
2020-6-13