1.降低drawcall数,提高项目流畅度。

2.cpu优化(主要是提高编译性,从代码角度方面减少cpu开销)。

降低drawcall 数是这篇文章的主要目的,至于CPU的优化,提高编译性,资源池什么的都简单写一下。

什么是drawcall?为啥drawcall数过多很影响体验?

drawcall就是CPU调用图形编程接口,比如DirectX或OpenGL,来命令GPU进行渲染的操作。每一次绘制,cpu都要调用drawcall,而在调用drawcall之前,CPU还要进行很多准备工作:检测渲染状态,提交渲染所需要的数据,提交渲染所需要的状态。而当需要执行的drawcall过多时,CPU就会忙于准备工作,此时GPU可能处于闲置状态。这就造成了项目运行卡顿,流失帧数等问题。所以drawcall数过高很影响体验。

降低drawcall数的方法。

1.合并Mesh。

我们可以将许多材质相同,贴图相同,shader相同的物体的mesh 合并成一个,这样合并的网格会在一次渲染任务中进行绘制,如果材质不同,合并的网格还是会在多次渲染任务中进行渲染,CPU还是会调用多次drawcall。

具体实现方法

a. 将所需要合并到物体放在一个空物体下,空物体得添加MeshFilter和MeshReader组件。然后再空物体下添加相关代码。具体操作可以参考:

下面是我实现mesh合并的代码。MeshFilter决定模型样貌,MeshRender决定模型颜色。

unity profiler 性能尖点 unity 性能优化_贴图


b.可以使用已经完善的脚本插件如:DCM 来快速降低drawcall数 。

注意如果有能力可以将贴图合并,是多个物体使用同一材质。

2.可以使用Unity自带的优化系统

如遮挡剔除技术,该技术可以将在摄像机视野外的物体和视野内被遮挡住的物体剔除掉,从而减少渲染任务,从而降低drawcall数。具体操作可以参考:

如灯光烘焙技术,该技术可以将已设置成静态(注意是静态 静态 静态)的物体的灯光特效等提前烘焙好,在项目运行时就不会在对这些物体进行灯光方面的渲染了。(优点是:减少了渲染压力,降低了drawcall数。缺点是:无交互性 灯光特效固定不变)

具体操作可以参考:

3.可以在模型上进行相关选择

如利用LOD技术降低drawcall数

你也可以在模型建立的时候考虑渲染,优化方面的问题,减少顶点数 面数 ,从根本解决问题。

本人对3d建模了解不深。。。。

可以参考:

以上是我现阶段所涉及的Unity优化方法(偏重渲染方面)。上面的方法只是概述,相关实际操作还得仔细斟酌。

CPU优化方面

1.资源池

在进行代码编辑时尽量不要无脑实例,可以用资源池来进行管理,实例(如游戏枪支子弹 小兵生成。。。),这样既可以优化内存,又可以优化CPU.

具体可以参考:

2.提高编译性能

就是每次编辑代码 保存后 Unity会将你所有代码编译一遍 不管你是否改变过,这样挺耗费时间和CPU的,我们可以通过将已确定不会更改的代码放入Plugins文件夹中,这样只要在Plugins文件夹下的代码不发生改变,Unity就不会重新编译它们。当然这也会带来一些局限性(因为Plugins是提前编译了,所以有些后面编译的类,方法啥的不能调用)。

又是一早上。嘤嘤嘤。