首页 > 其他分享 >Unity优化 场景DrawCall千千万,血条就能占一半

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

时间:2024-12-21 18:55:33浏览次数:7  
标签:血条 propertyBlock DrawCall renderers Unity 场景 GPU 千千万 void

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

前言

在战斗场景打开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分段式血条

标签:血条,propertyBlock,DrawCall,renderers,Unity,场景,GPU,千千万,void
From: https://blog.csdn.net/a71468293a/article/details/144633805

相关文章

  • Unity中检查重复的资源
    目的:检查Unity中资源是否重复,例如有两张贴图,明明是一张,却被复制为两份放在工程中,名字或者所在目录位置不同,这对于资源管理来说是很浪费的。因此需要写一个检查工具来检查项目中是否存在重复的资源。思路:Unity引擎内部对资源的管理是否有一个唯一标识,通过这个唯一标识来检查是......
  • Unity 学习记录
    大二做游戏的学习记录2D地图制作Tilemap是用来创建2d游戏地图的工具,允许使用Tile(瓦片)来拼接和绘制出一个大型的2D游戏场景只适用于显示地图,不直接进行物理交互如何使用Tilemap制作地图?步骤1:创建Tilemap游戏对象创建一个2D项目(如果你还没有创建的话)。在Hierarchy......
  • Unity中实现通过控制Scroll View内物体顺序来做排序
    Unity中实现通过控制ScrollView内物体顺序来做在Unity开发中,ScrollView是一个非常常用的UI组件,用于展示一系列可以滚动查看的内容。有时候,我们可能需要允许玩家或用户通过按键来控制这些内容的顺序,比如在一个游戏的选择界面或菜单中。本文将介绍如何实现这一功能。一、......
  • Unity复刻胡闹厨房复盘 模块一 新输入系统订阅链与重绑定
            本文仅作学习交流,不做任何商业用途        郑重感谢siki老师的汉化教程与代码猴的免费教程以及搬运烤肉的小伙伴                                                         版本:Unity6......
  • 【Unity实用技巧】Transform组件位置快速对齐(编辑器扩展)
    前言在Unity项目开发中,经常需要调整物体的位置。特别是在处理3D模型时,我们可能需要将一个父物体移动到其所有子物体的中心位置或底部中心位置。本文将介绍如何通过Unity编辑器扩展来实现这个功能,让美术同学在摆放模型时更加方便。一、效果演示二、完整代码这里直接上......
  • 【Unity基础】Unity中拖拽3D物体的过程分析和实现方法
    我们先来分析一下Unity中拖拽物体的过程:第一步:先检测拖拽的输入方式,可以鼠标,触摸,可以用InputManager输入,也可以使用InputSystem输入第二步:获取触碰点的位置,并计算offset。第三步:在每一帧里改变物体的位置。其实3D物体拖拽的过程可以分为上面几个清晰的步骤,而每一步都有......
  • 【Unity 低多边形3D 资源包】POLYGON Prototype - Low Poly 3D Art by Synty 专为游戏
    POLYGONPrototype-LowPoly3DArtbySynty是一款由知名工作室SyntyStudios提供的高质量低多边形(LowPoly)3D资源包,专为游戏开发者打造,适用于快速创建原型、概念演示和低多边形风格的游戏项目。它提供了一个全面的低模资产集合,既能满足开发需求,又具有出色的美术表现力......
  • 【Unity 军事基地和战争环境插件】Military Base Megapack 高质量的军事基地场景、建
    MilitaryBaseMegapack是一款为Unity开发者设计的插件,提供了一系列高质量的军事基地场景、建筑物、车辆、道具和其他环境资源,专门用于构建军事主题的游戏或应用。该插件以细致的3D建模和高效的资源管理为特色,适用于需要丰富战场、军事设施和战斗环境的项目。无论是战术类、......
  • 【Unity 计算机视觉插件】OpenCV for Unity 轻松实现图像处理、目标检测、物体识别、A
    OpenCVforUnity是一款功能强大的Unity插件,将著名的计算机视觉库OpenCV无缝集成到Unity中,为开发者提供丰富的计算机视觉功能支持。通过该插件,开发者可以轻松实现图像处理、目标检测、物体识别、AR增强现实等复杂功能,适用于多种平台,包括Windows、macOS、Android、iOS等。功......
  • 【Unity功能】Unity分页器
    前言在开发Unity项目时,经常会遇到需要展示大量数据的情况,比如物品列表、排行榜等。为了提供更好的用户体验,我们通常会使用分页功能来展示这些数据。本文将介绍如何在Unity中实现一个功能完整的分页器组件。一、效果演示二、制作过程简言这个分页器具有以下特点:1、支......