首页 > 其他分享 >Unity3D 性能杀手Overdraw详解

Unity3D 性能杀手Overdraw详解

时间:2024-01-11 14:46:31浏览次数:32  
标签:Unity3D Overdraw 透明 物体 合并 详解 renderer 材质

前言

Unity3D是一款强大的游戏开发引擎,但在使用过程中,我们需要注意一些可能会影响游戏性能的因素。其中之一就是Overdraw(过度绘制),它可以成为性能杀手。本文将详细解释Overdraw的概念、原因以及如何通过代码实现来减少Overdraw对游戏性能的影响。

对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀

Overdraw是指在渲染过程中,同一像素被多次绘制的现象。当游戏中有大量的透明物体叠加在一起时,Overdraw就会发生。这是因为在渲染管线中,像素的颜色计算是基于背后像素的颜色计算的。当多个透明物体重叠在一起时,每个像素都需要计算多次,导致性能下降。

造成Overdraw的原因有很多,其中之一是使用了过多的透明材质。透明材质在渲染过程中需要额外的计算资源,因此使用过多的透明材质会增加Overdraw的发生概率。另一个原因是过度使用粒子系统。粒子系统在渲染过程中会产生大量的透明像素,因此过度使用粒子系统也会增加Overdraw的发生。

为了减少Overdraw对游戏性能的影响,我们可以采取一些优化措施。首先,我们可以合并多个透明物体为一个物体。通过将多个透明物体合并为一个物体,可以减少Overdraw的发生。其次,我们可以使用不透明的材质替代透明材质。不透明材质不需要额外的计算资源,因此可以减少Overdraw的发生。此外,我们还可以通过减少粒子系统的使用来减少Overdraw的发生。

下面我们将通过代码实现来说明如何减少Overdraw的影响。假设我们有一个场景,其中有多个透明物体叠加在一起。我们可以通过以下代码来合并这些透明物体为一个物体:

// 创建一个空物体来存放合并后的物体
GameObject mergedObject = new GameObject("MergedObject");

// 获取场景中所有透明物体的渲染器组件
Renderer[] renderers = FindObjectsOfType<Renderer>();

// 创建一个新的网格来存放合并后的顶点和三角形数据
Mesh mergedMesh = new Mesh();

// 遍历所有透明物体的渲染器组件
foreach (Renderer renderer in renderers)
{
    // 如果物体是透明的
    if (renderer.material.shader.name.Contains("Transparent"))
    {
        // 将物体的网格数据合并到新的网格中
        mergedMesh.CombineMeshes(new[] { renderer.GetComponent<MeshFilter>().sharedMesh });
        
        // 禁用物体的渲染器组件
        renderer.enabled = false;
    }
}

// 将新的网格赋给合并后的物体
mergedObject.AddComponent<MeshFilter>().sharedMesh = mergedMesh;
mergedObject.AddComponent<MeshRenderer>();

// 将合并后的物体放置在场景中原来透明物体的位置
mergedObject.transform.position = renderers[0].transform.position;

// 将所有透明物体的父物体设置为合并后的物体
foreach (Renderer renderer in renderers)
{
    if (renderer.material.shader.name.Contains("Transparent"))
    {
        renderer.transform.SetParent(mergedObject.transform);
    }
}

通过以上代码,我们将多个透明物体合并为一个物体,从而减少了Overdraw的发生。同时,我们还禁用了原来透明物体的渲染器组件,以避免它们对性能的影响。

除了合并透明物体,我们还可以使用不透明材质来替代透明材质。以下是一个简单的示例代码,用于将透明材质替换为不透明材质:

// 获取场景中所有透明物体的渲染器组件
Renderer[] renderers = FindObjectsOfType<Renderer>();

// 遍历所有透明物体的渲染器组件
foreach (Renderer renderer in renderers)
{
    // 如果物体是透明的
    if (renderer.material.shader.name.Contains("Transparent"))
    {
        // 将物体的材质替换为不透明材质
        renderer.material.shader = Shader.Find("Standard");
    }
}

通过以上代码,我们将所有透明物体的材质替换为不透明材质,从而减少了Overdraw的发生。

总结起来,Overdraw是Unity3D中的一个性能杀手,会降低游戏的帧率。为了减少Overdraw对游戏性能的影响,我们可以通过合并透明物体、使用不透明材质以及减少粒子系统的使用来优化游戏性能。通过以上代码实现的示例,我们可以有效地减少Overdraw的发生,提升游戏的性能。

更多视频教学

Unity3D教程​www.bycwedu.com/promotion_channels/2146264125

标签:Unity3D,Overdraw,透明,物体,合并,详解,renderer,材质
From: https://www.cnblogs.com/liuwenyi/p/17958534

相关文章

  • 详解白帽子以及红队、蓝队和紫队
    企业继续数字化,其关键基础设施和运营扩大了攻击面,暴露于各种威胁途径的面前。为了解决这个问题,企业领导者认识到拥有内部专家的重要性。考虑到网络威胁领域不断发展的态势,企业领导者可以利用道德黑客以及红队、蓝队和紫队的工作,比恶意攻击者和高级持续性威胁(APT)领先一步。这些实践......
  • 基于k8s Deployment的弹性扩缩容及滚动发布机制详解
    k8s第一个重要设计思想:控制器模式。k8s里第一个控制器模式的完整实现:Deployment。它实现了k8s一大重要功能:Pod的“水平扩展/收缩”(horizontalscalingout/in)。该功能从PaaS时代开始就是一个平台级项目必备编排能力。若你更新了Deployment的Pod模板(如修改容器的镜像),则Deployment......
  • linux之信号操作(九千字长文详解)
    linux之信号操作sigset_t这是信号在内核中的表示==block和pending都是位图——即用bit位来表示信号编号!==每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次,阻塞标志也是这样表示的。因此,未决和阻塞标志可以用==相同的数据类型sigset_t==来存储,==sigset_t......
  • Unity DOTS物理引擎的核心分析与详解
    最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们来给大家分享和介绍一下这个物理引擎的使用。Unity.Physics的设计哲学 Unity.Physics是基于DOTS设计思想的一个高性能C#物理引擎的实现,  包含了物理刚体的迭代计算与碰撞检测等查询。Unity.P......
  • Unity3D 最后一次drawcall 如何避免详解
    Unity3D是一款广泛使用的游戏开发引擎,它基于C#编程语言,可以实现跨平台的游戏开发。在Unity3D中,drawcall是一个非常重要的概念,它指的是渲染引擎每次渲染物体时所调用的函数。过多的drawcall会导致游戏性能下降,因此我们需要采取一些措施来避免过多的drawcall。对啦!这里有个游戏开发......
  • Unity3D 如何把全部游戏逻辑都放到lua层实现详解
    Unity3D是一款非常流行的游戏开发引擎,它支持C#、JavaScript和Boo等脚本语言。然而,有时候我们可能希望将全部游戏逻辑都放到Lua层实现,这样可以更方便地进行游戏逻辑的修改和调试。本文将详细介绍如何使用Unity3D将全部游戏逻辑都放到Lua层实现。对啦!这里有个游戏开发交流小组里面......
  • 【愚公系列】2024年01月 WPF控件专题 ListBox控件详解
    ......
  • 详解GaussDB(DWS)通信安全的小妙招:连接认证机制
    本文分享自华为云社区《GaussDB(DWS)数据库安全系列之通信安全》,作者:yd_262982826。1.前言网络是一个开放的环境,仅仅依靠用户名和密码难以应对复杂的网络环境,针对可能存在的身份伪造的欺骗行为,以及监听通信内容的窃听行为,为了确保通信双方身份的真实性和通信内容的私密性,防止非法......
  • MyBatis实战指南(二):工作原理与基础使用详解
    MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。那么,它是如何工作的呢?又如何进行基础的使用呢?本文将带你了解MyBatis的工作原理及基础使用。一、MyBatis的工作原理1.1MyBatis的工作原理工作原理图示:1、读取MyBatis配置文件mybatis-config.xml为MyBat......
  • 美国服务器配置参数详解:了解其硬件及规格
    ​美国服务器提供的配置规格范围广泛。现成型号具有不同的存储容量、存储技术(例如HDD、SSD)、内存大小、CPU、内核和带宽速度。选择错误的规格可能意味着您的服务器无法完成您想要的任务,或者您最终会为一台比您需要的功能更强大的机器付出太多代价。因此,在寻找美国服务器前,建......