【UnityShader入门精要学习笔记】第十六章 Unity中的渲染优化技术 (下)

在这里插入图片描述
本系列为作者学习UnityShader入门精要而作的笔记,内容将包括:

  • 书本中句子照抄 + 个人批注
  • 项目源码
  • 一堆新手会犯的错误
  • 潜在的太监断更,有始无终

我的GitHub仓库

总之适用于同样开始学习Shader的同学们进行有取舍的参考。


文章目录

  • 减少需要处理的顶点数目
    • 优化几何体
    • 模型的LOD技术
    • 遮挡剔除技术
  • 减少需要处理的片元数目
    • 控制绘制顺序
    • 小心透明物体
    • 减少实时光照和阴影
  • 节省带宽
    • 减少纹理大小
    • 使用分辨率缩放
  • 减少计算复杂度
    • Shader 的LOD技术
    • 代码方面的优化


上一节我们描述了如何通过减少DrawCall来减轻CPU的资源调度压力。本章中我们将从其他方面来优化性能:

减少需要处理的顶点数目

优化几何体

3D游戏制作离不开3D模型。由于渲染时需要逐顶点逐面片渲染,因此优化3D模型是很重要的。

一般的原则是优化模型的网格结构,减少模型中的顶点数量(面数)

有时,Unity中显示的顶点数量会超过模型本身的顶点数量。这是由于在GPU看来,有时为了计算的需要,会将一个顶点拆分为两个顶点,主要目的有两个:一个是为了分离纹理坐标(uv splits),另一个是为了产生平滑的边界(smoothing splits)

它们的本质其实是对于GPU来说的,顶点的每一个属性和顶点之间必须是一对一的关系。例如一个立方体,它的六个面之间有一些相同的顶点,但是这些顶点相对于每个面的纹理坐标就不同了,因此就会拆分为多个不同纹理坐标的顶点,平滑边界也是类似的。因此一个顶点可能会对应多个法线信息和切线信息。

因此我们需要尽可能减少顶点数量,一个建议是——移除不必要的硬边以及纹理衔接,避免边界平滑和纹理分离。


模型的LOD技术

另一个减少顶点数目的方法是使用LOD技术,LOD技术的原理是为模型准备好几套不同细节程度的模型(纹理),然后根据摄像机和物体间的距离选择为模型加载的LOD层级,Unity就会自动使用对应等级的模型。

一般离得越远则细节程度越低,离得越近细节程度越高


遮挡剔除技术

遮挡剔除就是Occlusion Culling,就是剔除那些我们看不到的物体(面),避免计算不必要的资源。

像摄像机自带的Culling效果,对层级手动设置的Culling效果,包括Shader的背面和正面剔除都是出于这一目的的。

注意区分摄像机的遮挡剔除和视锥体剔除(Frustum Culling),视锥体剔除是剔除不在摄像机视锥内的物体,而遮挡剔除是剔除摄像机视锥内看不见的物体,其原理是用一个虚拟摄像机来遍历场景,并识别那些物体是可见的,哪些是不可见的。

LOD技术和遮挡剔除技术可以同时减少CPU和GPU的负荷,CPU可以提交更少的DrawCall,而GPU需要处理的顶点和面数也少了。


减少需要处理的片元数目

另一个造成GPU的性能瓶颈的原因是需要处理过多的片元。除了我们之前说的减少模型网格顶点数减少片元外,这部分的重点更在于减少OverDraw——即同一个像素的重复绘制。

想象一下,有一个B物体挡在了A物体的前面。若我们先渲染A物体,再渲染B物体,那么同一个像素被渲染了两次,显然A物体是没必要渲染的,就造成了OverDraw,这时我们可以用深度测试来避免这一情况

在这里插入图片描述
我们可以再Scene视图下查看overdraw的情况,来判断物体之间的遮挡。

控制绘制顺序

为了避免OverDraw ,一个重要的优化策略就是控制绘制顺序。由于深度测试的存在,如果我们可以保证物体都是从前往后绘制的,就可以最大限度减少OverDraw。这是因为,在后面绘制的物体由于无法通过深度测试因此不会重复渲染。

在Unity中,那些渲染队列数目小于2500的(如BackGround ,Geometry,AlphaTest)的对象都被认为是不透明的(Opaque)的物体,不透明的物体通常是从前往后绘制的。

而其他队列例如(“Transparent”,“Overlay"等)则是从后往前绘制的,因为这些队列常常是透明度渲染的,这些渲染就比较麻烦,为了正确的渲染效果我们往往还需要手动控制渲染顺序。

在开发中,我们考虑到摄像机下一些人或物在屏幕上的渲染顺序,为它们设置不同的渲染队列,将节省很多渲染时间。


小心透明物体

对于半透明物体来说,由于它们没有开启深度写入,因此如果想要得到正确的渲染结果,必须从后往前渲染,因此为了正确的渲染效果,半透明物体一定会产生overdraw的。

因此,如果屏幕上存在大量半透明物体或者粒子效果,甚至多层半透明效果相互堆叠的情况,就会有大量的OverDraw,这是我们需要避免的。特别是GUI对象的渲染常常要用到半透明效果。

对于上述的情况,我们可以减少视窗中GUI的面积以减少OverDraw的像素。也可以把GUI的绘制和三维场景的绘制交给不同的摄像机,并且三维摄像机的视角范围尽量不要和GUI的相互重叠。


减少实时光照和阴影

实时光照和阴影的计算是很昂贵的,我们之前讲光照的时候说过,实时光照的渲染(特别不属于主光源的部分,例如点光源)会调用每个照射到的物体上的Pass。导致Pass一下子增多了。

例如一个场景如果包含了3个逐像素的光照,而且使用了逐像素的Shader,那么很有可能将DrawCall的数量提高3倍。

并且无论是静态批处理还是动态批处理,额外的逐像素光照pass都会导致中断批处理!

当然游戏是少不了光照的,少用实时光不代表不用光照效果,我们往往会为模型提前烘焙好一张光照纹理和阴影纹理,根据光照方向来进行计算采样来代替实时光照效果。只有某些动态物体才会使用实时光照


节省带宽

大量使用未经压缩的纹理以及使用过大的分辨率都会造成由于带宽引发的性能瓶颈。

减少纹理大小

使用纹理图集atlas可以帮助我们减少DrawCall的数量(因为图集中的所有纹理都可以通过一次DrawCall提交),除此之外纹理大小也是一个需要考虑的问题。所有纹理的长宽比最好是正方形,而且长宽值最好是2的整数幂,这样很多的优化策略才能发挥最大的作用。

除此之外,我们还可以用多级渐远技术和纹理压缩来优化纹理,当勾选了Generate Mip Maps则生成多级渐远纹理,和LOD技术相似,根据远近来选择渲染的纹理。在GUI和2D游戏中使用的纹理等,都应该为纹理生成相应的多级渐远纹理。

纹理压缩同样可以节省带宽,不同的GPU架构可能有不同的纹理压缩格式,除了有时我们需要纹理特别清晰时(例如GUI)我们不希望对纹理进行压缩。


使用分辨率缩放

过大的屏幕分辨率和糟糕的GPU也会造成带宽压力大, 在特定的设备上,我们还需要对程序指定分辨率缩放。


减少计算复杂度

Shader 的LOD技术

Shader的LOD技术和模型的LOD技术类似,其原理是当Shader的LOD值小于当前的LOD值,该shader才会被使用,否则使用了该Shader的物体不渲染。

在未设置LOD值的Shader中,LOD是无限大的,也就是无论如何都使用。在设定了LOD值之后,我们若想要剔除部分复杂计算的Shader就可以通过设置LOD值来剔除,方法是使用Shader.maximumLODShader.globalMaximumLOD来设定允许的最大LOD


代码方面的优化

通常来说,游戏需要计算的数量排序是:游戏对象数量<顶点数量<像素数量。因此我们应当尽可能将操作放在游戏对象上或者顶点上。

例如之前我们采样坐标时放在了顶点着色器上而非片元着色器,就大大提高了计算性能。

(以下说的优化策略在某些设备上不成立,这很正常)

  1. 尽量使用低精度的浮点数进行运算。最高精度的float类型用于存储顶点坐标等变量,但是像颜色值,归一化值这类范围为[0,1]的我们就会使用fixed,half通常使用与一些标量,纹理坐标等变量,计算速度大概是float的两倍。尽量避免不同精度间的值转换。(特别考虑别在片元着色器中使用高精度计算)
  2. 对于大多数的GPU,在数据传递阶段,例如用v2f将数据从顶点着色器传递到片元着色器的时候,我们尽可能使用少的插值变量,例如可以用一个fixed4存储,就不用两个fixed2。(有些平台,例如PowerVR例外)
    3.尽量不使用全屏的屏幕后处理效果,尽量把多个特效合并在一个Pass中
  • 尽量别用if分支语句和for循环语句
  • 尽量避免sin,tan,pow,log等复杂数学运算,我们可以用查找表来代替
  • 尽量不要使用discard

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/665292.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】操作系统之冯诺依曼体系

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 操作系统中 冯诺依曼体系 的相关内容。 如果看到最后您觉得这篇文…

基于编译型语言鲲鹏应用开发小技巧

编译型语言应用执行过程 大部分应用可以通过重新编译即可移植到鲲鹏平台 预处理命令: gcc -E hello.c -o hello.i&#xff0c;预处理完成后使用命令: cat hello.i可以看到预处理后的代码 编译命令: gcc -s hello.i -o hello.s 汇编命令: gcc -c hello.c -o hello.o 链接处理…

接口测试之XML响应断言

目录 XPath 基本语法XML 响应结果解析XML 响应结果断言 XML 响应数据 如何提取 AddResult 中的值&#xff1f; <soap:Body><AddResponse xmlns"http://tempuri.org/"><AddResult>4</AddResult></AddResponse> </soap:Body> …

SpringBoot中MyBatisPlus的使用

MyBatis Plus 是 MyBatis 的增强工具&#xff0c;提供了许多强大的功能&#xff0c;简化了 MyBatis 的使用。下面是在 Spring Boot 中使用 MyBatis Plus 的步骤&#xff1a; 添加依赖&#xff1a;在 Maven 或 Gradle 的配置文件中添加 MyBatis Plus 的依赖。 配置数据源&#…

AI换脸FaceFusion一键云部署指南

大家好&#xff0c;从我开始分享到现在&#xff0c;收到很多朋友的反馈说配置很低玩不了AI。本篇是一个云端部署AI项目的指南&#xff0c;帮助大家在云端进行AI项目的部署。我会从云平台的选择、代码部署、保存镜像几个方面进行详细的介绍。没有代码基础的小白也不用担心&#…

QT系列教程(6) 几种标准对话框

几种标准对话框 本文介绍几种标准对话框&#xff0c;都是Qt封装好的&#xff0c;我们先创建一个界面&#xff0c;添加几个按钮&#xff0c;然后分别在几个按钮的回调函数里添加创建不同对话框的逻辑 颜色对话框 颜色对话框用来选择颜色&#xff0c;创建后会显示各种颜色和透明…

神经网络-------人工神经网络

一、什么是神经网络和神经元 人工神经网络&#xff08;英语&#xff1a;Artificial Neural Network&#xff0c;ANN&#xff09;&#xff0c;简称 神经网络&#xff08;Neural Network&#xff0c;NN&#xff09;或 类神经网络&#xff0c;是一种模仿生物神经网络&#xff08;…

扫描文件怎么扫描的?

这里的扫描通常可能有二种解释&#xff1a;一种是只是将物品通过扫描仪形成数字化图像&#xff0c;另一种则是通过手机直接将物品上的文字通过拍照&#xff0c;再经过OCR转换成计算机可编辑的文字。 第一种&#xff1a;你可以按照以下步骤来扫描文件&#xff1a; 1. 打开扫描…

pikachu靶场(unsafe upfileupload(文件上传)通关教程)

目录 client check 1.在桌面新建一个文本文档 2.保存为.png格式 3.打开网站 4.按照图中操作 5.点击forward 6.访问 MIME type 1.新建一个php文件&#xff0c;里面写上 2.上传文件&#xff0c;就是我们保存的文件 3.打开抓包工具&#xff0c;点击开始上传 4.修改Conen…

【并发程序设计】12.内存映射

12.内存映射 使一个磁盘文件与内存中的一个缓冲区相映射&#xff0c;进程可以像访问普通内存一样对文件进行访问&#xff0c;不必再调用read,write&#xff0c;更加高效。 用到的函数 mmap函数 原型&#xff1a; #include <sys/mman.h> void* mmap(void* start, size_…

销售数据分析怎么做?看这一篇就够了

销售数据分析&#xff0c;简而言之&#xff0c;就是通过对销售数据的收集、整理、分析和解释&#xff0c;发现其中的规律和趋势&#xff0c;从而为销售策略的制定提供有力的数据支持。在当今数据驱动的时代&#xff0c;销售数据分析已经不再是专业数据分析师的专属技能&#xf…

【项目管理知识】项目质量管理措施

1、持续改进&#xff08;PDCA&#xff09; 戴明循环或称PDCA循环、PDSA循环。戴明循环的研究起源于20世纪20年代&#xff0c;先是有着“统计质量控制之父”之称的著名的统计学家沃特阿曼德休哈特&#xff08;Walter A. Shewhart&#xff09;在当时引入了“计划-执行-检查&…

去噪扩散概率模型在现代技术中的应用:图像生成、音频处理到药物发现

去噪扩散概率模型&#xff08;DDPMs&#xff09;是一种先进的生成模型&#xff0c;它通过模拟数据的噪声化和去噪过程&#xff0c;展现出多方面的优势。DDPMs能够生成高质量的数据样本&#xff0c;这在图像合成、音频生成等领域尤为重要。它们在数据去噪方面表现出色&#xff0…

结构体相关习题的补充

结构体相关习题的补充 题目1&#xff1a; 如有以下代码&#xff1a; struct student {int num;char name[32];float score; }stu;则下面的叙述不正确的是&#xff1a;( ) A.struct 是结构体类型的关键字 B.struct student 是用户定义的结构体类型 C.num, score 都是结构体…

带文字的短视频:成都鼎茂宏升文化传媒公司

带文字的短视频&#xff1a;视觉与文字的交织艺术 在信息爆炸的时代&#xff0c;短视频以其直观、生动的视觉呈现方式&#xff0c;迅速成为人们获取信息、娱乐休闲的重要渠道。然而&#xff0c;随着人们对内容深度和质量要求的提升&#xff0c;成都鼎茂宏升文化传媒公司单纯的…

一文搞懂分布式事务-Saga

Saga定义 Saga模式是一种分布式事务处理模式&#xff0c;用于保证分布式系统中的一系列操作要么全部成功执行&#xff0c;要么全部回滚&#xff0c;以实现一致性的目标。它采用了长事务的概念&#xff0c;将原子操作拆分为多个子事务&#xff0c;并通过补偿机制保证整个事务的…

知识图谱抽取实战

相关代码见文末 1.知识图谱应用场景 知识图谱是一种先进的数据组织形式,它通过图数据结构来表示实体(如人、地点、概念)及其之间的复杂关系,便于机器理解和处理。这种结构化知识库允许高效的信息检索、推理和知识发现,尤其适用于处理高度关联且需要深度理解的领域,如医学…

深入了解diffusion model

diffusion model是如何运作的 会输入当时noise的严重程度&#xff0c;根据我们的输入来确定在第几个step&#xff0c;并做出不同的回应。 Denoise模组内部实际做的事情 产生一张图片和产生noise难度是不一样的&#xff0c;若denoise 模块产生一只带噪声的猫说明这个模块已经会…

【考试100】安全员B证《建设工程安全生产技术》单选题

​ 题库来源&#xff1a;考试100 【考试100】安全员B证《建设工程安全生产技术》单选题 1&#xff0e;在悬空部位作业时&#xff0c;操作人员应&#xff08; &#xff09; A.遵守操作规定 B.进行安全技术交底 C.戴好安全帽 D.系好安全带 【考试100答案】&#xff1a;D…

华为云的云主机安装的linux系统不能使用yum下载软件包、程序、组件等

目录 一、背景介绍 二、问题描述 1、尝试使用yum安装traceroute 2、更换yum源 3、使用curl命令访问百度&#xff0c;测试网络 三、问题分析和解决 1、修改网卡设置 &#xff08;1&#xff09;ifconfig查看网卡信息 &#xff08;2&#xff09;添加DNS 2、修改/etc/res…