GPU:负责整个渲染流水线。它会从处理CPU传递过来的模型数据开始,进行Vertex Shader、Fragment Shader等一系列工作,最后输出屏幕上的每个像素。因此它的性能瓶颈包括顶点、像素、显存等因素有关。
GPU的瓶颈主要存在在如下的方面:
1.像素分辨率,可以简单的理解为图形处理单元每秒渲染的像素数量,可以在unity的Player Settings中设置降低分辨率。
2.像素的复杂度,比如动态阴影,光照,复杂的shader等等
3.几何体的复杂度(顶点数量)
4.GPU的显存带宽:存储带宽是指GPU在其特定的内存上的读写速率
优化:
1减少绘制的数目:尽可能减少模型中三角形的数目,尽可能重用顶点,对于GPU来说,它本质上只关心有多少个顶点。因此,尽可能减少顶点的数目其实才是我们真正对需要关心的事情。移除不必要的Hard Edge以及纹理衔接,即避免Smoothing splits和UVsplits。遮挡剔除是用来消除躲在其他物件后面看不到的物件,这代表资源不会浪费在计算那些看不到的顶点上,进而提升性能。控制绘制顺序,主要原因是为了最大限度的避免overdraws,也就是同一个位置的像素可以需要被绘制多变。在Unity中,那些Shader中被设置为“Geometry” 队列的对象总是从前往后绘制的,而其他固定队列(如“Transparent”“Overla”等)的物体,则都是从后往前绘制的。这意味这,我们可以尽量把物体的队列设置为“Geometry” 。减少实时光照,使用Lightmaps,使用God Rays,使用mobile版的shader。。LOD技术有点类似于Mipmap技术,不同的是,LOD是对模型建立了一个模型金字塔,根据摄像机距离对象的远近,选择使用不同精度的模型。它的好处是可以在适当的时候大量减少需要绘制的顶点数目。它的缺点同样是需要占用更多的内存,而且如果没有调整好距离的话,可能会造成模拟的突变。
2.LOD:LOD(level of detail)技术可以用来减少较远网格的复杂度,通过减少需要渲染的顶点数量同时不影响游戏的表现效果。菜单Component-Rendering-LODGroup。
3.优化显存带宽:主要途径是减少贴图的内存占用来提高游戏的性能,贴图压缩 贴图压缩可以极大的减少贴图在磁盘和内存中的占用率。如果游戏的内存是我们的限制因素,则压缩贴图可以提高游戏的性能。使用mipmap,MipMap会占用内存,但能提高图片渲染的质量(比压缩要好)。
4.游戏中的图像特效会极大的造成像素问题,特别是有多个图像特效。如果游戏受到像素的影响同时又采用了图像特效,则最好对图像特效进行优化,比如用优化后的爆炸特效来替代优化前的爆炸特效。特别是在同一个相机上有多个图像特效,这会造成多个shader pass,这种情况下最好将多个图像特效合并在一个shader pass中。如果这样设置都不能解决问题,则最好考虑是否能不用图像特效,特别是在低端机上。
5.如果游戏中的模型网格没有使用法线贴图,则可以在导入设置的时候剔除切线顶点来减少顶点数量。
6.警惕透明物体。GUI大多数被设置成半透明,尽量减少窗口中GUI所占的面积。如果实在无能为力,可以把GUI绘制和三维场景的绘制交给不同的摄像机,而其中负责三维场景的摄像机的视角范围尽量不要和GUI重叠。
7.减少实时光照。使用光照贴图Lightmaps;使用雾和体积光God Rays;使用mobile版的shader。
8.遮挡剔除:顾名思义就是被遮挡看不见的地方不渲染,例如墙后的物体。遮挡剔除可以CPU计算也可以GPU计算。Unity自带了OcclusiongCulling
9.降低渲染的分辨率:缩小Framebuff分辨率,减少ps开销和内存显存,但是会模糊,王者荣耀等很多主流游戏在Android上都降了分辨率。
如果觉得《unity性能优化-GPU》对你有帮助,请点赞、收藏,并留下你的观点哦!