一籽前、動態(tài)合批
- 要求相同材質亭珍,圖集
- 注意sprite穿插,影響合批枝哄。
為什么sprite層級會影響合批块蚌?
這關聯(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響應點擊,替代透明Image,無DrawCall方案
使用透明Image作為響應點擊的Graphic會增加一個DrawCall,如何實現(xiàn)一個無DrawCall方案呢主慰?
關鍵有2點:
- 繼承Graphic嚣州,override OnPopulateMesh方法
toFill.Clear();
。 - 實現(xiàn)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方法的重寫
- 改寫入圓形頂點數(shù)據(jù)--已知半徑秦效;
- 設置uv等信息;