UGUI(2) 減少DrawCall

一、動態(tài)合批

  1. 要求相同材質(zhì),圖集
  2. 注意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]
    ...
}
  1. 注意Mask組件,Mask使用了模板緩沖區(qū),內(nèi)部子節(jié)點不能和外部合批.

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點:

  1. 繼承Graphic,override OnPopulateMesh方法 toFill.Clear();。
  2. 實現(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方法的重寫

  1. 改寫入圓形頂點數(shù)據(jù)--已知半徑;
  2. 設(shè)置uv等信息;

丟掉Mask遮罩,更好的圓形Image組件[Unity]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容