Unity 性能优化的手段

对象池

使用对象池:频繁地创建和销毁对象会导致性能下降和内存碎片化。对象池可以预先创建一些对象,然后在需要时从池中取出,不再使用时再放回池中。

减少Draw Calls

Draw Call是指CPU向GPU发送绘制命令的次数。减少Draw Call可以通过批处理,合并网格,使用贴图集等方法实现

批处理

批处理(Batching)是在游戏开发和3D图形渲染中常用的一种性能优化技术,尤其在使用像Unity这样的游戏引擎时。它的核心目的是减少CPU向GPU发送的绘制指令(即Draw Calls)的数量,从而提升渲染效率。以下是详细的批处理概念和使用方法:

批处理的基本概念

  1. Draw Call:Draw Call是CPU告诉GPU:“请绘制这个对象”的命令。每个Draw Call都涉及状态设置、顶点数据传输等操作,这些都会消耗时间和资源。

  2. 批处理:批处理的思想是将多个渲染操作组合成一个较大的批次(Batch),以减少Draw Calls的总数。这通常涉及将使用相同材质和纹理的多个对象渲染为一个大的绘制操作。

Unity中的批处理类型

在Unity中,主要有两种类型的批处理:

  1. 静态批处理(Static Batching)

    • 用于优化静态(不动的)游戏对象。
    • 在游戏构建过程中,Unity会自动将所有标记为“静态”的且共享相同材质的游戏对象合并成一个批次。
    • 适用于场景中的建筑物、地形等不会移动的对象。
  2. 动态批处理(Dynamic Batching)

    • 用于优化动态(会移动的)游戏对象。
    • 在运行时,Unity会试图将小的、材质相同的游戏对象合并为单个批次。
    • 有顶点数和总批次大小的限制(例如,Unity中通常是顶点数不超过900)。

实现批处理的技巧和最佳实践

  1. 共享材质:确保尽可能多的对象使用相同的材质。这是批处理能否成功的关键因素。

  2. 使用图集:将多个小纹理打包到一个大的纹理图集中,这样不同的对象即使使用不同的纹理,也仍然可以合批。

  3. 减少材质属性的变化:例如,避免频繁更改材质的颜色或其他属性。

  4. 优化网格:对于动态批处理,保持网格简单(低顶点数)是重要的。

  5. 标记静态对象:在Unity编辑器中,确保场景中不会移动的对象被标记为“静态”。

  6. 合理使用LOD和遮挡剔除:这些技术可以减少渲染的对象数量,间接减少Draw Calls。

  7. 性能监控:使用Unity的Profiler工具监控Draw Calls和其他性能指标,以评估批处理的效果。

面临的问题

  • 内存使用:合批会增加内存使用,因为合并后的网格需要更多的内存来存储。
  • 灵活性降低:合批后,单独操作原始对象变得更困难。

合并网格

合并多个网格为一个大网格是一种在3D图形和游戏开发中常用的优化技术。网格(Mesh)是由顶点、边和面组成的3D对象的结构,在3D渲染中非常基础。合并网格意味着将多个单独的3D模型(每个都有自己的网格)结合成一个单一的、更大的网格。这个过程的具体含义和优点如下:

含义

  • 结构合并:将多个3D模型(如多个小物体)的顶点和面数据合并到一个单一的网格结构中。
  • 减少Draw Calls:每个独立的网格在渲染时通常需要一个单独的Draw Call。合并网格可以使这些原本独立的模型在一个Draw Call中被渲染,从而减少总的Draw Call数量。
  • 资源整合:合并网格通常伴随着纹理和材质的整合,例如使用纹理图集。

优点

  • 提高渲染效率:减少Draw Call数量可以降低CPU到GPU的通信负担,提高渲染效率。
  • 优化内存使用:通过减少资源(如材质和纹理)的重复使用,可以更高效地利用内存。
  • 适用于静态场景:这种技术特别适用于静态的、不会动的场景元素,如建筑物、地面等。

缺点

  • 灵活性降低:一旦网格被合并,单独操作原始网格中的一个部分变得更加困难。
  • 可能增加内存占用:如果合并后的网格体积很大,它可能会占用更多的内存。
  • 复杂度增加:处理一个大网格比处理多个小网格在逻辑上可能更复杂。

应用场景

  • 静态环境:用于不动的环境元素,如游戏中的建筑物、地形等。
  • 非交互元素:适用于玩家不需要与之交互的场景元素。

贴图集

在3D图形和游戏开发中,“使用贴图集(Texture Atlas)”是一种常用的优化技术。贴图集是将多个不同的纹理图像合并到一个单一的、更大的纹理图中的做法。以下是关于贴图集的详细解释:

贴图集的基本概念

  • 贴图集(Texture Atlas):一个大的纹理图(通常是矩形),包含了多个小的纹理。这些小纹理可能是不同的游戏元素的纹理,如角色的服装、游戏场景中的物体等。
  • 单一纹理调用:使用贴图集意味着多个对象可以共享同一个大纹理。在渲染时,这允许GPU通过单一的纹理调用来访问多个纹理,从而减少Draw Calls。

如何减少Draw Calls

  • 材质共享:由于多个对象可以共享同一个贴图集,这意味着它们也可以共享相同的材质。在图形渲染中,使用相同材质的多个对象可以被更容易地组合到一个批处理中。
  • 减少纹理切换:在渲染过程中,切换纹理是一个代价高昂的操作。使用贴图集可以减少这种切换,因为更多的纹理细节都包含在同一张大纹理图中。

LOD

根据物体与摄像机的距离,动态调整物体的细节级别,从而减少渲染负担。

LOD(Level of Detail)技术是一种在3D图形渲染中常用的优化手段,旨在提高渲染效率,同时尽量保持视觉质量。LOD的基本原理是根据对象与观察点的距离,动态地调整对象的复杂度。这里是LOD技术的一些关键点:

基本原理

  • 多版本模型:对于一个3D对象,创建多个不同复杂度的版本。这些版本从高到低详细度排序,例如:高、中、低多边形模型。
  • 视距感知:根据对象与相机(观察点)的距离,实时选择合适的模型版本进行渲染。

应用

  • 近处使用高详细度模型:当对象靠近相机时,使用高多边形、高分辨率纹理的模型,以提供更精细的视觉效果。
  • 远处使用低详细度模型:当对象远离相机时,切换到低多边形、低分辨率纹理的模型。由于远距离的视觉效果不那么明显,这样做可以大幅减少渲染负担,同时对视觉效果的影响最小。

优点

  • 提高渲染效率:通过减少远处对象的多边形数量,降低了渲染过程的计算负担。
  • 节省内存和带宽:使用较低分辨率的纹理和模型可以减少内存的使用和数据传输量。

挑战

  • 无缝过渡:在不同LOD级别之间切换时,需要小心处理,以避免突兀的视觉跳变。
  • 平衡选择:合理选择何时切换LOD级别,以及每个级别的详细程度,是LOD技术的关键。

LightMap

Lightmap(光照贴图)是一种在3D图形和游戏开发中常用的技术,用于提高场景的光照效果的同时优化性能。在这种技术中,光照信息被预先计算并存储在一张或多张纹理中,这些纹理随后被应用到场景中的对象上。以下是关于Lightmap的更详细的解释:

基本概念

  • 预计算的静态光照:Lightmap包含了场景中静态物体表面的光照信息,这些信息通常在游戏或应用的开发阶段预先计算。
  • 纹理:光照信息被存储在一种特殊的纹理中,这种纹理被映射到3D对象上,以模拟复杂的光照效果,如软阴影、反射和间接光照。

如何工作

  • 光照烘焙:在开发过程中,使用特殊的工具(如Unity的光照烘焙功能)计算场景的光照,并将结果“烘焙”到Lightmap中。
  • 映射到几何体:每个对象的表面细节(如几何形状和材质)与Lightmap中的相应区域相结合,从而在渲染时显示预计算的光照效果。

优点

  • 性能优化:由于光照信息是预先计算的,运行时不需要进行复杂的光照计算,这可以显著提高性能。
  • 高质量的光照效果:可以实现高质量的光照效果,包括软阴影、光线传播和光线反射。

缺点

  • 仅限于静态场景:Lightmap通常用于静态物体,因为它们是预先计算的。对于动态物体或变化的光源,需要其他光照技术。
  • 内存使用:高质量的Lightmap可能占用大量的纹理内存。

  • 使用 GPU Instancing:使用 GPU 实例化技术可以将多个相同的物体实例化,减少 Draw Call。可以通过创建 MaterialPropertyBlock 对象并调用 MaterialPropertyBlock.SetVectorArray 方法来实现 GPU Instancing。

资源异步加载

优化脚本

避免在Update函数中进行大量的计算或者频繁的内存分配,尽量减少使用Find系列函数,避免频繁的GC。

在Unity中,Find系列函数(如FindObjectOfType,Find,FindChild等)是非常消耗性能的操作,因为它们需要遍历整个场景或者对象的所有子对象。如果在Update或者频繁调用的函数中使用Find系列函数,会大大降低游戏的性能。

更好的做法是在Start或Awake函数中使用Find系列函数,将找到的对象保存在一个变量中,然后在需要的地方直接使用这个变量。这样就只需要在游戏开始时执行一次Find操作,而不是每帧都执行。

另外,如果可能的话,尽量使用public变量或者单例模式来引用需要的对象,这样可以完全避免使用Find系列函数。

使用Profiler工具:Profiler可以帮助你找到性能瓶颈,从而进行针对性的优化。

优化物理:减少物理模拟的复杂度,比如使用简化的碰撞体,减少不必要的物理计算

遮挡剔除

Occlusion Culling:隐藏摄像机看不见的物体,减少渲染负担。

  1. 使用Shader优化:使用更简单的Shader,或者针对特定平台优化Shader。

  2. 优化UI:避免频繁更新UI,尽量使用Canvas Group和Layout Group。

合并网格:将多个网格合并成一个网格,可以减少 Draw Call。可以使用 Unity 中的 Mesh.CombineMeshes 方法来实现网格的合并。
合并材质:将多个使用相同材质的物体合并成一个物体,可以减少 Draw Call。可以使用 Unity 中的 MaterialPropertyBlock 来实现材质的共享。
使用静态批处理:将多个静态物体合并为一个批次进行渲染,可以减少 Draw Call。可以在 Unity 中开启静态批处理来实现。
使用动态批处理:将多个动态物体合并为一个批次进行渲染,可以减少 Draw Call。可以在 Unity 中开启动态批处理来实现。
使用 GPU Instancing:使用 GPU 实例化技术可以将多个相同的物体实例化,减少 Draw Call。可以通过创建 MaterialPropertyBlock 对象并调用 MaterialPropertyBlock.SetVectorArray 方法来实现 GPU Instancing。
使用 Atlas 贴图:将多个小贴图合并成一个大贴图,可以减少 Draw Call。可以使用 Unity 中的 SpritePacker 工具来实现贴图的合并。
减少动态物体的数量:动态物体需要每帧重新绘制,因此数量过多会导致 Draw Call 增加。可以通过使用静态物体、使用 LOD 等方式来减少动态物体的数量。
减少透明物体的数量:透明物体需要额外的渲染步骤,因此数量过多会导致 Draw Call 增加。可以通过使用不透明物体、使用 Alpha Test 等方式来减少透明物体的数量。
使用 Occlusion Culling:根据摄像机视锥体内的可见 UI 元素,减少需要渲染的 UI 元素数量,从而提高渲染性能。
 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】赋值运算符重载

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

使用 python ffmpeg 批量检查 音频文件 是否损坏或不完整

自用工具,检查下载的音乐是否有损坏 或 下载不完整 使用方法,把 in_dir r’D:\158首无损珍藏版’ 改成你自己的音乐文件夹路径 如果发现文件有损坏,则会在命令行打印错误文件的路径 注意,要求 ffmpeg 命令可以直接在命令行调用…

GPIO的使用--存储系统与位带操作理解

目录 存储系统与位带操作 1、对GPIO的操作函数 2、计算机对地址的管理 3、板子地址 4、什么是位带操作 5、位带地址好处 存储系统与位带操作 1、对GPIO的操作函数 //方案一 GPIO_WriteBit(GPIOF,GPIO_Pin_9,0);//方案二 GPIO_Write(GPIOF,0x0000);//方案三 GPIOF->O…

开放式耳机怎么选?干货分享! 2023好评度超高开放式耳机推荐!

在现代社会中,人们对于音乐和通话的需求越来越高。传统的耳机虽然能够提供良好的音质,但使用过程中存在一些问题,例如长时间佩戴会引起耳朵疲劳和隔绝周围环境的声音。为了解决这些问题,开放式耳机应运而生,成为了一种…

java实现日历效果

java实现打印某年全部的信息 import java.util.Calendar; import java.util.GregorianCalendar;public class shuz {public static int[][] calendarArray(int year,int month) {// 创建Calendar对象并设置日期为2023年8月1日Calendar calendar Calendar.getInstance();calen…

【springboot原理篇】Bean的加载方式,面试必看

🌈键盘敲烂,年薪30万🌈 目录 一、上古时代原始方式: 📕XML文件 ~~bean定义 👀演示获取bean: ❌缺点: 📕注解方式: ~~component ~~指定扫描路径&#…

vm net 方式 静态ip配置访问主机IP和外网

1、win 11 安装vm,镜像文件 F:\software\VMwork\CentOS-7-x86_64-Everything-1804.iso 2、配置网络 net 方式 3、右击网络--》属性---》更改适配器设置--》vmnet8 属性 如果没有vm1、vm8 虚拟机编辑---》虚拟机网络编辑器-->还原默认设置 注意:这…

接口验签规则

一、验签的背景 在网络发展快速的过程中,总是会忽略接口数据安全问题,进行验签则能够在一定程度上能够防刷,数据篡改。 二、什么是加签验签 加签验签, 发送消息方,对消息加签名; 接受消息方&#xff0…

英语学习(去餐馆篇)

一、预定餐位 1.餐馆 1)谈论食物 Seafood is their specialty. 海鲜是他们的特色菜。 They serve authentic Italian food. 他们供应正宗意大利菜。 2)谈论餐馆名声 The restaurant has a great reputation. 这家餐馆名声很好。 Th…

使用Notepad++编辑器,安装AnalysePlugin搜索插件

概述 是一款非常有特色的编辑器,Notepad是开源软件,Notepad中文版可以免费使用。 操作步骤: 1、在工具栏 ->“插件”选项。 2、勾选AnalysePlugin选项,点击右上角“安装”即可。 3、 确认安装插件 4、下载插件 5、插件已安装…

Java 设计模式——备忘录模式

目录 1.概述2.结构3.案例实现3.1.“白箱”备忘录模式3.2.”黑箱”备忘录模式 4.优缺点5.使用场景 1.概述 (1)备忘录模式 (Memento Pattern) 又称为快照模式,是一种行为型设计模式,它提供了一种保存和恢复对象状态的机制。备忘录模…

涓流充电计时电路芯片D1302,具有双管脚主电源和备用电源,可编程涓流充 电器VCC1,还有 31 字节的暂存器等功能

D1302 涓流充电计时电路包含一个实时时钟 / 日历和 31 字节的静 态RAM ,通过简单的串行接口与微处理器通讯。这个实时时钟 / 日历 提供年月日、时分秒信息,对于少于31 天的月份月末会自动调整, 还有闰年校正。由于有一个 AM/PM 指示器&a…

天翼云:“百万IOPS”助推政企上云

随着数字化转型的加速,越来越多的企业选择了业务上云。众所周知,不论是政企关键/核心业务中的大型数据库、NoSQL、AI训练,还是互联网业务中的游戏、渲染等场景,对数据读写IOPS和时延有极高的要求。作为全球领先的云服务商&#xf…

分享77个菜单导航JS特效,总有一款适合您

分享77个菜单导航JS特效,总有一款适合您 77个菜单导航JS特效下载 链接:https://pan.baidu.com/s/1sfT9ONLH4ocliA1C7Z5xbQ?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气&#xff0…

K8S 工具收集

杂货铺,我不用 K8S,把见过的常用工具放在这里,后面学的时候再来找 名称描述官网Pixie查看 k8s 的工具。集群性能、网络状态、pod 状态、热点图等HomeKubernetes Dashboard基于 Web 的 Kubernetes 集群用户界面。GithubGardenerSAP 开源的 K8…

75Ω视频放大驱动芯片 D1671,2.8~5.5V 内 置 SAG端 子 6dB放 大 器 电 路,应用于手持设备中

D1671 是 一 块 带 4 级 低 通 滤 波 的 单 通 道 视 频 放 大 电 路 , 可 在 3V 或 5V的 低 电 压 下 工 作 。 该 电 路 用 在 有 TV 影 象 输 出 功 能 的 产 品 上 面 , 比 如 机 顶 盒 ,监 控 摄 象 头 ,DVD &#xf…

骨传导耳机音量大了有害吗?骨传导能保护听力吗?

无论是传统耳机还是骨传导耳机,只要使用音量过大,都会对有一定的损伤,然而由于骨传导耳机的传声原理和佩戴方式比较特殊,所以对人体的损伤比较小,想要知道骨传导耳机能否保护听力,就要先了解骨传导耳机的传…

【Axure教程】用中继器制作多选树

“多选树”可能指的是一种用户界面元素,用于展示层级结构并允许用户选择多个节点。这在软件应用程序中常用于设置、文件浏览器等场景。 Axure里面虽然自带了一个树元件,但是并没有多选的功能,所以今天就教大家如何用中继器制作一个多选树的基…

acwing-Linux学习笔记

acwing-Linux课上的笔记 acwing-Linux网址 文章目录 1.1常用文件管理命令homework作业测评命令 2.1 简单的介绍tmux与vimvimhomeworktmux教程vim教程homework中的一些操作 3 shell语法概论注释变量默认变量数组expr命令read命令echo命令printf命令test命令与判断符号[]逻辑运算…

Vue3集成ThreeJS实现3D效果,threejs+Vite+Vue3+TypeScript 实战课程【一篇文章精通系列】

Vue3集成ThreeJS实现3D效果,threejsViteVue3TypeScript 实战课程【一篇文章精通系列】 项目简介一、项目初始化1、添加一些依赖项 二、创建3D【基础搭建】1、绘制板子,立方体,球体2、材质和光照3、材质和光照和动画4、性能监控5、交互控制6、…