Unity 性能优化方案

‌Unity性能优化的主要方案包括以下几个方面‌:

一、减少Draw Call‌

Draw Call就是CPU调用图形编程接口,是CPU向GPU发送的命令
1.CPU和GPU并行工作的原理
CPU和GPU工作有一个命令缓冲区(Command Buffer)
命令缓冲区包含了一个命令队列,由CPU向其中添加命令,而由GPU从中读取命令。当CPU需要渲染一些对象时,它可以向命令缓冲区添加命令,而GPU完成了上一次的渲染任务后,它就可以从命令队列里取出一个命令并执行它。
命令缓冲区中的命令有很多种类,而Draw Call是其中的一种,其它命令还有改变渲染状态等命令(改变使用的Shader,使用不同的纹理等)。
2.为什么 Draw Call多了会影响帧率?
在每次调用Draw Call之前,CPU需要向GPU发送很多内容,包括数据,状态,命令等。CPU完成了这些准备工作,GPU就可以开始本次的渲染。如果Draw Call的数量太多,CPU就会把大量时间花费在提交Draw Call命令上,造成CPU的过载。
3.如何减少DrawCall?
DrawCall是CPU调用底层图形接口。比如有上千个物体,每一个的渲染都需要去调用一次底层接口,而每一次的调用CPU都需要做很多工作,那么CPU必然不堪重负。但是对于GPU来说,图形处理的工作量是一样的。所以对DrawCall的优化,主要就是为了尽量解放CPU在调用图形接口上的开销。所以针对drawcall我们主要的思路就是每个物体尽量减少渲染次数,多个物体最好一起渲染。所以,按照这个思路就有了以下几个方案:
·通过把纹理打包成图集来尽量减少材质的使用,相同的材质直接共用。
·尽量少的使用反光阴影之类的,因为会使物体多次渲染。
·mesh合并,减少CPU需要提交的模型信息次数。
·使用GPU Instance一次绘制多个相同的物体。
·优化shader 减少pass通道
·注意OverDraw
·合理规划场景中的物体层级‌

二、优化渲染性能‌

1.纹理压缩‌:使用适当的纹理压缩格式可以显著减少内存使用和GPU负担。Unity支持多种压缩格式,如ETC2、PVRTC等‌。
‌2.减少模型数量和三角形面数‌:通过减少模型数量和使用法线贴图代替细节模型来优化渲染性能‌。
‌3.使用LOD技术‌:根据物体与摄像机的距离调整模型的细节级别,减少远距离物体的渲染负担。
4.Occlusion Culling-遮挡剔除:只渲染在视野内的游戏物体,可以很大的优化我们的性能。
5.减少是实时光照的使用,使用光照贴图。

三、优化物理计算‌

‌1.减少物理组件的使用‌:只在必要的GameObject上添加物理组件(如Rigidbody、Collider),避免不必要的物理计算‌。如果可以使用BoxCollider等简单的,尽量不要使用meshcollider。
‌2.调整物理引擎设置‌:通过调整物理引擎的精度和迭代次数,例如减少Fixed Timestep,可以提高帧率但可能牺牲物理模拟的准确性‌。

四、内存管理‌

1.卸载非活动资源‌:使用Resources.UnloadUnusedAssets()函数卸载当前未使用的资源,减少内存占用‌。

五:代码优化‌:

1.提高代码效率
·减少循环的执行次数和循环中的指令数目。
·将不需要频繁执行的方法从 Update() 中移出。
·只在变化发生时才去执行代码。例如,不对未变化的量进行反复的输出。
·将需要频繁执行且不能通过事件触发的方法改为每隔几帧执行一次。例如,记录帧数(Time.frameCount)并通过模运算跳过某些帧,通过该方式,也能做到让几个方法不在同一帧中执行。
·使用缓存存储需要反复获取和使用的值。例如,将GetComponent()方法的返回值存储到变量中,避免反复获取。
·根据需求选用正确的数据结构,尤其是在数据驱动的开发模式中。
·使用对象池优化内存使用和降低CPU开销。创建和销毁对象的开销通常要比激活(SetActive(true))和取消激活对象的开销更高,尤其是对于那些含有初始化内容的对象,如发射子弹。
2.避免调用高开销的Unity API
·SendMessage()和BroadcastMessage()。在了解项目结构的前提下,SendMessage()和BroadcastMessage()方法使用起来非常灵活而且容易实现,但它使用了反射,而反射会造成更多的CPU开销。在清楚要调用哪个组件的哪个方法时应该通过组件的引用直接调用方法;在不清楚具体要用的组件和方法时,考虑使用 委托和事件。
·Find()方法会遍历内存中的每个GameObject和组件,随着项目规模的扩张,它的开销将会越来越大。不要频繁的使用Find()和与其类似的方法,可以考虑在Inspector中设置对对象的引用,或者创建一个专门用于管理需要搜索的对象的引用的脚本,包括Camera.main 类似。
·Transform。localPosition存储在transform中,访问该值时,Unity会直接将其返回,而position在每次访问时都会重新计算,如果要经常获取position,可以将其缓存起来。
·Update()和LateUpdate()等事件方法的每次调用都需要引擎代码与托管代码之间进行通信,还要Unity进行安全检查(GameObject状态是否合法等),即使这些事件方法的方法体是空的,引擎任然会对其进行调用。因此,为避免浪费CPU时间,应该 删除空的事件方法。另外,如果某个活动状态(gameObject.active == true)的GameObject上的脚本中含有Awake()方法,即使这个脚本没有被启用(enabled==false),Awake()方法也会执行。如果游戏中含有非常多的带有Update()方法的MonoBehavior,应该尝试改变代码结构来减少开销。
·Vector2 Vector3。向量的数学运算要比普通的浮点数和整数的数学运算更加复杂,访问向量的某些属性可能会带来隐含的开销,例如magnitude属性(不仅针对向量,例如上文提到的Transform.position)。每次访问magnitude,引擎都会进行开平方运算,虽然单次计算并不会消耗多少时间, 但当数量级足够大时,这种开销将变得明显。可以尝试使用sqrMagnitude(即magnitude的平方)替代magnitude,减少开平方操作。

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

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

相关文章

Spark 核心概念与宽窄依赖的详细解析

Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…

快速删除图片脚本

电脑上存了几百万张小图片,让电脑慢慢删除了5个小时还没有删完,就写了一个python脚本,开启多线程删除,调整线程数量,让CPU和硬盘占有率都到100%,1个小时就删除了.感谢这段代码哈. 逻辑为删除当前目录下所有二级子目录中的文件,每个二级子目录由一个线程处理,每当一个…

【树莓派raspberrypi烧录Ubuntu远程桌面登入树莓派】

提示:本文利用的是Ubuntu主机和树莓派4B开发板,示例仅供参考 文章目录 一、树莓派系统安装下载前准备工作下载安装树莓派的官方烧录软件imagerimager的使用方法 二、主机与树莓SSH连接查看数梅派IP地址建立ssh连接更新树莓派源地址 三、主机端远程桌面配…

MySQL数据库专栏(四)MySQL数据库链接操作C#篇

摘要 本篇文章主要介绍C#链接MySQL数据库的接口介绍,使用实例及注意事项,辅助类的封装及调用实例,可以直接移植到项目里面使用。 目录 1、添加引用 2、接口介绍 2.1、MySqlConnection 2.2、MySqlCommand 2.3、MySqlDataReader…

百度世界2024:AI应用的浪潮时刻

百度AI公式:“技术商业社会”。 作者|金豫 编辑|杨舟 互联网行业正迈入增长瓶颈期,这一点从主要科技巨头,如Meta、Alphabet、腾讯等近年来的表现中可见端倪:广告收入增速放缓,市场渗透率接近饱和。 单纯依赖流量获取…

Linux 通过nmcli配置网络并配置bond(网卡绑定)

Linux 通过nmcli配置网络并配置bond Linux 通过nmcli配置网络并配置bond1. 什么是 Bond 网卡绑定2. Bond 网卡绑定的常见模式3. 通过nmcli配置网络并做网卡绑定 Linux 通过nmcli配置网络并配置bond 1. 什么是 Bond 网卡绑定 Bond 网卡绑定(或 NIC Bonding&#xff…

PCL 点云拟合 最小二乘法拟合平面

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1计算点云质心 2.1.2最小二乘法拟合平面 2.1.3可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一…

【Stable Diffusion - Ai】小白入门必看(想控制AI的绘画结果?ControlNet 预处理篇)!真材实料!不卖课!!!

【Stable Diffusion - Ai】小白入门必看(想控制AI的绘画结果?ControlNet 预处理篇)!真材实料!不卖课!!! 对于ControlNet来说,很多人都会感觉到陌生;这个插件…

几何合理的分片段感知的3D分子生成 FragGen - 评测

FragGen 来源于 2024 年 3 月 25 日 预印本的文章,文章题目是 Deep Geometry Handling and Fragment-wise Molecular 3D Graph Generation, 作者是 Odin Zhang,侯廷军,浙江大学药学院。FragGen 是一个基于分子片段的 3D 分子生成模…

Mysql事务中的一些问题,还有解决方法原理(ACID、脏读幻读重复读、next-key)

** 首先,事务是什么? ** 是一系列或者一组sql操作看作一个整体,作为一个事务,这一组sql要么都执行,要么都不执行。当所有sql都能执行成功的时候,commit当前事务,当其中一个sql出现问题时&…

【设计模式系列】享元模式(十五)

目录 一、什么是享元模式 二、享元模式的角色 三、享元模式的典型应用场景 四、享元模式在ThreadPoolExecutor中的应用 1. 享元对象(Flyweight)- 工作线程(Worker) 2. 享元工厂(Flyweight Factory)- …

为什么分布式光伏规模是6MW为界点

安科瑞 华楠 近日,能源局发布定义分布式光伏6MW及以上的光伏电站必须自发自用,自行消纳。多省能源局规定大于6MW的电站必须按集中式管理,另外大于6MW(包含)要省级审批,小于则由市级审批,10kV线…

RDD 算子全面解析:从基础到进阶与面试要点

Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…

如何利用 CAS 实现原子操作:深入浅出原子类与线程安全

在并发编程中,确保线程安全是一个重要话题。为了避免多个线程对同一数据进行竞争访问,Java 提供了原子类(Atomic Classes)来保证并发场景下的线程安全,而原子类最核心的实现机制就是 CAS(Compare And Swap&…

四万字长文SpringBoot、Spring、SpringMVC等相关面试题(注:该篇博客将会持续维护 最新维护时间:2024年11月12日)

🧸本篇博客重在讲解SpringBoot、Spring、SpringMVC等相关面试题,将会实时更新,欢迎大家添加作者文末联系方式交流 📜JAVA面试题专栏:JAVA崭新面试题——2024版_dream_ready的博客-CSDN博客 📜作者首页&…

02_ElementUI

一.前端工程化 1.1 概述 前端工程化是使用软件工程的方法来单独解决前端的开发流程 中模块化、组件化、规范化、自动化的问题,其主要目的为了 提高效率和降低成本。 1.2 NodeJS的安装 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环 境,可以使 JavaS…

关于Unity使用LookAt时为什么不能旋转

使用LookAt会使物体的Z轴对准某坐标 但是X和Y轴也是定死的,所以这个时候你再旋转也就没有效果了 解决方法: 使用辅助空物体: 可以创建一个空物体作为父节点,将其对准目标位置(使用 LookAt),…

三、运算符、数据类型转换(显式、隐式)、语句(if、三元、switch、while、for)

1. 运算符 1.1 自增自减 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> &…

数据安全、信息安全、网络安全区别与联系

关键字&#xff1a; 信息安全 数据安全 网络安全 [导读] 在 “互联网 ” 被广泛提及的今天&#xff0c;安全问题也越来越多的受到人们关注&#xff0c;然而很多人对于 “信息安全”、“数据安全”、“网络安全” 的概念并不是很清楚。我们汇总了官方机构给这三者的定义&#…

Vue.js:构建现代 Web 应用的强大框架

一、引言 在当今快速发展的 Web 开发领域&#xff0c;Vue.js 以其简洁、高效和灵活的特点脱颖而出。作为一个渐进式 JavaScript 框架&#xff0c;Vue.js 为开发者提供了一种全新的方式来构建用户界面&#xff0c;无论是小型项目还是大型企业级应用&#xff0c;Vue.js 都能发挥出…