Unity优化 场景DrawCall千千万,血条就能占一半

Wan2.2-I2V-A14B

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

前言

在战斗场景打开Frame Debug窗口,发现场景中的血条绘制了100次,需要优化一下。

使用GPU Instancing的好处

  • 极低的DrawCall数量
  • 高效的GPU利用率
  • 支持大量实例同时渲染
  • 内存占用较低
  • 更新性能优秀

项目

场景布置

创建一个空物体

空物体

创建脚本并挂载赋值

创建一个材质球
这里使用ASE创建一个简单的Shader意思一下
创建脚本和材质球并挂载
简单的shader

编写代码

using UnityEngine;
using System.Collections.Generic;

public class CreateHPBar : MonoBehaviour
{
    public GameObject hpBarPrefab;
    public Material sharedMaterial;
    private MaterialPropertyBlock propertyBlock;
    private List<MeshRenderer> renderers = new List<MeshRenderer>();

    void Awake()
    {
        propertyBlock = new MaterialPropertyBlock();
    }

    void Start()
    {
        // 1. 首先创建所有实例并收集渲染器引用
        for (int i = 0; i < 10; i++)
        {
            GameObject hpb = Instantiate(hpBarPrefab, new Vector3(i * 2, 0, 0), Quaternion.identity);
            MeshRenderer render = hpb.GetComponent<MeshRenderer>();
            render.sharedMaterial = sharedMaterial;
            renderers.Add(render);
        }

        // 2. 一次性设置所有属性
        UpdateAllHPBars();
    }

    // 统一更新所有血条的方法
    private void UpdateAllHPBars()
    {
        propertyBlock.Clear(); // 清除之前的属性设置

        // 为每个渲染器设置相同的PropertyBlock
        for (int i = 0; i < renderers.Count; i++)
        {
            propertyBlock.Clear();
            propertyBlock.SetFloat("_FakeHpValue", 0.1f * i);
            renderers[i].SetPropertyBlock(propertyBlock);
        }
    }

    // 如果需要动态更新某个血条
    public void UpdateSingleHPBar(int index, float value)
    {
        if (index >= 0 && index < renderers.Count)
        {
            propertyBlock.Clear();
            propertyBlock.SetFloat("_FakeHpValue", value);
            renderers[index].SetPropertyBlock(propertyBlock);
        }
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Q))
        {
            UpdateSingleHPBar(2, 1.0f);
        }
        if (Input.GetKeyDown(KeyCode.W))
        {
            UpdateSingleHPBar(2, 0.0f);
        }
    }
}

使用GPU Instancing优化血条渲染

此时运行场景能够看到这些血条并没有合批
错误情况
需要设置修改的值为Instanced Property
修改Instanced Property参数属性
并且勾选Per Renderer Data
勾选Per Renderer Data参数
确保Shader设置中勾选GPU Instancing
确保Shader中勾选GPU Instancing

修改完成之后
修改正确降低DrawCall

总结

这种方案不适用于UGUI系统

可以直接应用于此血条(需要修改Shader为URPUnLit)
Unity Shader分段式血条

您可能感兴趣的与本文相关的镜像

Wan2.2-I2V-A14B

Wan2.2-I2V-A14B

图生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值