Unity项目优化相关技巧
作者:LOONGV 发布时间:2022-10-14 00:43:59
一、简单优化
1.图片纹理大小尽量为2的幂次方(比如128,512,1024等等),以便unity对其进行优化。
2.将多个小图片纹理合并一个大的图片纹理以降低drawcall,特别是同一个ui面板的元素都放到一个图集中,背景图片尽量单独做一个图片。
3.尽可能的共用材质球,原因同上。
4.不需要播放动画的模型把Animator或animation组件删除掉,因为不管用或不用他们都会被初始化。
5.模型方面要注意尽可能的减少顶点数和三角面数,尽可能重用顶点
6.纹理的mipmap视情况开关(一般用于3D场景,UI和2D游戏中不要使用),打开的话可以减少纹理叠加时的抖动闪烁问题加快渲染速度,减少图像锯齿;但是会占用更多的内存空间以及使项目的打包文件变大(毕竟生成了一系列逐层缩小的备份小图)。
7.将场景中不会发生变化(位移、旋转等)的物体设置为Static,方便unity进行静态批处理。
8.打开player setting中的静态批处理(Static Batching)和动态批处理(Dynamic Batching):静态批处理需要勾选场景中不需要变化的物体的Batching Static,否则不会起到优化效果;注意,使用合批处理后仅是降低了CPU到GPU的传输次数和SetPassCall且不需要再次执行顶点变化操作,但是会增大包体及内存消耗。
9.灯光方面Spotlight开销很大要尽量少用。
10.尽量少用实时阴影,若必用不可则使用Hard Shadow。
11.谨慎使用半透明材质和UI以减少overdraw,如alpha为0的image虽然不可见但是gpu仍然会对其进行绘制;若UI中存在很多半透明界面,建议UI由单独的摄像机进行渲染,且UI不要叠加到场景摄像机渲染范围内。
二、优化进阶
1.使用缓冲池管理需要经常出现和销毁的object。
2.视情况使用lod技术,使用此技术需要制作多套模型,故而会使项目的打包文件变大同时会占用更多内存,但是可以降低需要绘制的顶点数目,若距离调整不好可能会出现模型突变的情况。
3.视情况使用OC(遮挡剔除)功能(通常用于场景中有大量模型的情况),使用此功能可以大大降低overdraw(毕竟被遮挡的物体直接不渲染了),需要注意物体的大小要与单元格大小达到一个平衡;可以通过设置物体的Occluder Static和Occludee Static来控制物体为遮挡物或被遮挡物。此技术的缺点就是会耗费额外的CPU。
4.使用灯光贴图搭配light probe group来替代实时光照,使用此技术对模型要求较高,不能有UV错乱、法线错乱的情况,否则会出现很奇葩的状况;同时使用此技术将不会有动态阴影生成。
5.针对不同的平台对纹理进行压缩(比如IOS为pvrtc;安卓为ETC1,若有alpha通道则使用RGBA 16-bit),需要注意的是压缩后有时会影响纹理的质量。
6.不同UI界面使用多个Canvas,因为unity为了性能优化会合并canvas下所有元素到一个Mesh中;如果所有界面放到一个canvas,在界面发生变化的时候会造成重绘,降低性能,最优解是一个静态的ui放一个canvas,动态的ui视情况分别放到不同canvas中,注意也不要分的太细不然会造成dc的增加。
7.蒙皮网格动画改为顶点动画,用空间换时间
8.移动端若对渲染帧率没有特定要求,可以通过降低帧率的形式来节省机器性能,需要注意在 QualitySettings.vSyncCount中不能设置为Don't Sync否则下面的设置将无效,设置方式如下:
在项目配置类或主类中的Awake或Start中加入下面的代码
Application.targetFrameRate = 30; //移动平台默认30为比较节省电量的帧率,若要达到最佳性能则设置为300(这样机器会尽其所能提高帧率,但是很大概率达不到300)
9.合理利用Profiler进行性能瓶颈分析与优化。
10.将Terrain转为Mesh,大地图使用流式加载及卸载技术。
11.模型的蒙皮网格动画改为顶点动画,用空间换时间。
12.使用Animation Instancing优化大量模型动画。
13.尽可能用BoxCollider替代MeshCollider。
三、深度优化(操作起来比较复杂,需要掌握一些底层知识或需要极端优化的情况)
1.使用自定义shader
2.合并mesh(此处可以学习下林大佬写的相关博客)
3.UI中不涉及到射线检测的Canvas把GraphicRaycaster组件删掉
4.尽量少用LayoutGroup和contentSizeFitter,虽然用起来比较方便,但是在用户操作时会导致整个ui界面的重绘,有能力的大牛建议自己写一个算法来实现局部的重绘,没有能力的就只能在使用这俩组件的地方使用单独的Canvas来尽量避免整个UI的重绘了。
5.视情况使用单通道实例化渲染:要启用此功能,请打开 Player 设置(选择 Edit > Project Settings__,然后选择 Player__ 类别)。在 Player 设置中,导航到底部的 XR Settings 面板,选中 Virtual Reality Supported 选项,然后从 Stereo Rendering Method 下拉菜单中选择 Single Pass Instanced (Preview)。
四、代码相关优化
1.用for循环替代foreach、
2.用gameObject.CompareTag("tag")替代gameObject.tag="tag".
3.Find、GetComponent方法尽量在Start、Awake之中调用,不要在Update之类方法中调用。
4.用string.format替代+拼接字符串。
5.物理检测在fixedUpdate中进行。
来源:https://blog.csdn.net/u013032852/article/details/119573192
猜你喜欢
- 这篇论坛文章详细的讲解了使用SQL Server 2008管理非结构化数据的具体方法,更多内容请参考下文:microsoft SQL Ser
- 1.开始----程序-----oracle------配置和移植工具-----Net Manager----本地----服务命名---ora
- 本文实例讲述了Python使用sort和class实现的多级排序功能。分享给大家供大家参考,具体如下:# -*- coding:utf-8
- 我就废话不多说了,直接上代码吧!conv1=nn.Conv2d(1,2,kernel_size=3,padding=1)conv2=nn.C
- 前言python 可以做网站应用,也可以做客户端应用。但是客户端应用需要运行 py 脚本,如果用户不懂 python 就是一件比较麻烦的事情
- Mybatis报错: org.apache.ibatis.exceptions.PersistenceException解决办法一、问题描述
- 1.交换变量x = 6y = 5x, y = y, xprint x>>> 5print y>>> 62
- element-ui中el-select下拉框选项过多el-select中options数据超过3000条就会造成前端页面明显卡顿,本次我的
- 我们选择一种问题的解决办法,通常需要考虑到想要达到的效果,还有最重要的是这个办法本身的优缺点有哪些,与其他的方法对比哪一个更好。之前小编之前
- 迭代器聊迭代器前我们要先清楚迭代的概念:通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一
- 网上有很多免费的ip地址,都是可以使用的,但是如果手动来获取太麻烦,这里通过Python自动抓取,可以批量获取。代码如下:# -*- cod
- 从Web查询数据库:Web数据库架构的工作原理 一个用户的浏览器发出一个HTTP请求,请求特定的Web页面,在该页面中出发form表单提交到
- 前言:我目前使用的服务器为centos6.x 系统自带的python的版本为2.6.x,但是目前无论是学习还是使用python,python
- 前言首先抛出几个问题:console.log(Boolean({}));console.log(Number([]));console.lo
- <script language=javascript> </script>
- 前言可能很多小伙伴会因为pycharm全是英文而烦恼吧,本博主呢也是一个英语刚过四级的小白,深知大家的难处,所以会奉上最详细的修改中文的教程
- 一、变量声明变量go定义变量的方式和c,c++,java语法不一样,如下:var 变量名 类型, 比如 : var a intvar在前,变
- 详解MySQL导出指定表中的数据要求:1. 不导出创表的语句,因为表已经建好:默认会导出,先drop table然后create table
- #-*-coding:utf-8-*-'''Created on 2014年1月10日@author: hhdys&
- 谢谢icedblog提供的代码, 从那个js中我参考了moveSelect的利用, 不过那个代码中有几个BUG, 比如按住鼠标不放会不见显示