FairyGUI之drawcall优化

在实际开发中我们经常会使用到动态加载图片,比如背包中加载道具Icon.下面我们做个例子,来看看drawcall消耗.


首先我们使用FairyGUI编辑器制作一个List,然后动态加载图片到List中去.

这里写图片描述

    public UIPanel Panel;

    void Start()
    {
        GList list =  Panel.ui.GetChild("n0").asList;
        list.itemRenderer = RenderListItem;
        //创建18张图片
        list.numItems = 18;
    }

    private void RenderListItem(int index, GObject obj)
    {
        GLoader loader = obj.asCom.GetChild("n0").asLoader;
        //加载图片
        NTexture texture = new NTexture(Resources.Load<Texture>("img" + index % 9));
        loader.texture = texture;
    }

上面可以看到,我一共添加了18张图片到List中去.但是其中每两张都是重复的,实际上我使用到的图片资源只有9张.一共有19个drawcall,其中天空盒占一张, 18张图片各占一张.但是我们只有9张图片是不一样的,那么根据Unity的动态合并规则应该是只占9个drawcall,这样明显是不合理的.我们的每个NTexture都会占用一个drawcall,所以我们应该缓存起NTexture,相同的图片就使用同一个NTexture,而不应该每次都new,这样既优化了drawcall,也优化了内存.

    public UIPanel Panel;
    //图片缓存
    private Dictionary<string, NTexture> _textureDict = new Dictionary<string, NTexture>();

    void Start()
    {
        GList list =  Panel.ui.GetChild("n0").asList;
        list.itemRenderer = RenderListItem;
        //创建18张图片
        list.numItems = 18;
    }

    private void RenderListItem(int index, GObject obj)
    {
        GLoader loader = obj.asCom.GetChild("n0").asLoader;
        加载图片
        //NTexture texture = new NTexture(Resources.Load<Texture>("img" + index % 9));
        loader.texture = GetTexture("img" + index % 9);
    }

    private NTexture GetTexture(string name)
    {
        //从缓存中读取图片
        if (_textureDict.ContainsKey(name)) return _textureDict[name];

        //当缓存中没有图片,我们再加载
        NTexture texture = new NTexture(Resources.Load<Texture>(name));
        _textureDict.Add(name, texture);
        return texture;
    }

根据上面的代码,使我们重复利用了NTexture,所以我们得到的效果如下图:

这里写图片描述


现在可以看到18张图加上天空盒一共只占10个drawcall了.当然别忘记勾选UIPanel的FairyBatching,只有勾选了这个选项才能开起动态合并.

SkinMeshRenderer是Unity引擎用于渲染带有骨骼动画的模型的组件。由于骨骼动画会涉及到大量的顶点变换计算,因此SkinMeshRenderer的渲染性能优化是一个重要的问题。 一种常用的SkinMeshRenderer drawcall优化方法是使用Batching。Batching是将多个物体合并成一个批次进行渲染,从而减少draw call的次数。对于SkinMeshRenderer组件,可以通过以下方法进行Batching优化: 1. 合并相邻的骨骼动画模型:如果场景有多个使用相同材质的骨骼动画模型,可以将它们合并成一个模型,减少draw call的次数。 2. 合并相同材质的子网格:对于同一个骨骼动画模型,如果它有多个子网格(Submesh),而且使用相同的材质,可以将这些子网格合并成一个Submesh,减少draw call的次数。 3. 使用GPU Instancing:GPU Instancing是一种将多个实例化的模型对象渲染为一个draw call的技术。对于骨骼动画模型,可以使用GPU Instancing来优化渲染性能。 4. 减少骨骼数量:在设计角色的骨骼时,可以合理地减少骨骼的数量,从而减少顶点变换计算的复杂度。 5. 使用LOD(Level of Detail)技术:对于一些距离较远的骨骼动画模型,可以使用LOD技术来减少顶点数量和draw call的次数。 综上所述,通过合并模型、合并子网格、使用GPU Instancing、优化骨骼数量和使用LOD技术等方法,可以对SkinMeshRenderer组件的draw call进行优化,从而提高骨骼动画的渲染性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值