一、動態(tài)合批
- 要求相同材質(zhì),圖集
- 注意sprite穿插,影響合批。
為什么sprite層級會影響合批?
這關(guān)聯(lián)到渲染順序。UI元素的默認Render Queue是3000 (UI-Default.shader),即
"Queue"="Transparent",半透明對象,沒有開啟深度寫入ZWrite Off,要得到正確的的渲染效果,就必須從后向前渲染(相對于相機)。
若sprite穿插,只能從后向前渲染,無法合批成1次渲染。

UI元素的默認Render Queue.png
UI-Default.shader節(jié)選:
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響應(yīng)點擊,替代透明Image,無DrawCall方案
使用透明Image作為響應(yīng)點擊的Graphic會增加一個DrawCall,如何實現(xiàn)一個無DrawCall方案呢?
關(guān)鍵有2點:
- 繼承Graphic,override OnPopulateMesh方法
toFill.Clear();。 - 實現(xiàn)ICanvasRaycastFilter,將 Raycast Target置為true,這樣才能響應(yīng)點擊。
示例:
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方法的重寫
- 改寫入圓形頂點數(shù)據(jù)--已知半徑;
- 設(shè)置uv等信息;