对于unity 中的性能优化现在最主流的做法就是减少Draw Call 数量,那么Draw Call 究竟是什么呢,要怎么样才可以减少呢。这是一个问题。。。。。。。。。好吧,接下来我们就一起康康吧。
想要直接看结果的童鞋请移步文章结尾。
1.Draw Call 究竟是什么;
其实了解过计算机的童鞋都知道计算机中包含CPU和GPU,CPU的主要功能有四个,分别是顺序控制、操作控制、时间控制、数据加工,那么GPU就不用说了吧,别人就叫显卡,他的主要功能肯定就是负责图形图像的显示处理啦。那么他们是怎么协同工作的呢,这里就会提到我们的图形绘制接口(DirectX和OpenGL),想要了解的童鞋可以去这里瞧一瞧;20分钟让你了解OpenGLhttps://zhuanlan.zhihu.com/p/56693625https://zhuanlan.zhihu.com/p/56693625
那么重点来啦 ,其实draw call 就是cpu通过对图形绘制接口的调用来命令gpu进行渲染的操作;每调用一次图形接口就会产生一个draw call; 所以我们要提高游戏性能就必须减少gpu对图形接口的调用次数,
2.接下来就一起看看具体怎么操作吧,其中主要可以通过4种方式来进行unity的游戏性能优化
资源优化:对于模型和贴图的优化我在这里都不具体说明了 ,毕竟小哥哥我也不是一个模型或者美术,具体的我也理解得不多,不知道如何操作,我们可以在有限的范围内尽量减少模型的三角面,减少材质数量。具体想了解的童鞋,请自行百度。下面有一个对手游的不成熟标准(此标准仅供个人参考)
动态模型:面片数<3000 材质数<3 骨骼数<50
静态模型:定点数<500
背景音乐:建议使用(压缩格式)MP3
音效:建议使用(非压缩格式)wav
第二就是resources目录下的资源不管是否被引用,都会被打包进安装包,不使用的资源部就不要放在resources目录下了;同时不同目录下的相同资源文件,如果都被引用,那么他们都会被打包进资源包,造车冗余,所以我们需要尽可能的保证同一个资源文件在项目中只存放在一个目录位置。
渲染优化:妖兽啊,重点来啦 重点来了 之前的就是和美术、模型相关 和 我们关系不怎么大,接下来就是展示真正技术的时候了。
LOD技术:啥?lod是啥。这个通俗的来说吧,就是当摄像机距离物体较远的时候就采用不那么精细的模型,当摄像机距离物体比较近的时候才使用精度高的模型,接下来让我们试一试吧;(该技术需要模型配合,为统一物体创建不同精度的模型)
2.我们要实现的效果就是在摄像机最近的时候显示最右边的模型,一般远的时候显示中间的模型,
比较远的时候显示左边的模型,特别远的时候就不显示;
创建新场景,添加一个空物体,并挂载LOD Group组件,然后我们分别将不同精度的模型放在lod0,lod1,lod2处;
接下来就可以调整设想据的距离看看效果了,
遮挡剔除:通俗的来说遮挡剔除就是只显示摄像机范围内物体,当物体在摄像机范围外时就不再显示该物体;
1.首先我们创建很多个铁桶,同时我们勾选上static中的Occlude Static;
2.打开window界面中的Occlusion Culling面板。
3.接下来我们进行遮挡剔除数据的烘焙;
4.最后我们点击cameras添加我们的摄像机
5.最后我们可以看到的结果是只显示摄像机范围内的铁桶;
6.让我们来对比一下使用遮挡剔除前后的draw call数量吧
光照贴图技术:如果场景中拥有很多光源,灯光采用实时渲染就会对游戏性能产生巨大的影响,为了减少光源对游戏性能的影响,我们需要将光照信息烘焙为光照贴图,具体操作的话请看看这位大佬的博客吧;
unity 烘焙 光照贴图 以及一些灯光的相关问题(一)_王王王渣渣的博客-CSDN博客
Mesh 合并:在渲染的过程中希望是材质越少越好,贴图也越少越好,当然mesh也是越少越好,当然模型mesh的合并可以在模型软件中完成,也可以在unity中完成,当然我们现在只针对在unity中完成mesh的合并;
1.创建一个空物体,并在空物体下创建几个cube,并在空物体下挂载Mesh Filter 和Mesh Renderer组件
2接下来运行程序你将会看见一个合并后的模型;
代码优化:代码优化我觉得你应该会知道的哦,那就是我们熟知的对象池,如果还有不知道的小伙伴就去看看这几篇文章吧
Unity3D研究院之利用缓存池解决Instantiate慢的问题(七十三) | 雨松MOMO程序研究院
Unity3D研究院之初探PoolManager插件(七十四) | 雨松MOMO程序研究院
[译]Unity3D内存管理——对象池(Object Pool) - Lyon Gu - 博客园
Unity 性能优化之写个简单的缓存池 - 简书
同时现在还有很多插件和工具可以帮助我们对游戏性能进行优化,比如ab包资源冗余检测等等。
3.总结一下
资源优化:1.模型优化---减少模型三角面
2.贴图优化---合并贴图
3.resources文件夹中资源整合
渲染优化:1.使用LOD技术
2.使用遮挡剔除
3.使用光照贴图——lightMapping
4.合并mesh——combineInstance()方法
代码优化:1.使用对象池
优化工具:推荐uwa工具unity游戏优化工具