场景优化的学习

作者: S_H_C | 来源:发表于2017-08-02 12:42 被阅读0次

    最近要做一个VR一体机(可以当做一部安卓机)的项目,但是场景资源导入后发现在一体机上跑不动,帧率只有20左右,快速转动头部的时候帧率更低,所以学习了一下场景优化的知识,下面就分享一下我学到的知识。

    一、降低DrawCall的数量

    DrawCall(又称DC),在Unity中,每次引擎(CPU)准备数据并通知GPU的过程称为一次Draw Call,GPU通过这些数据进行运算再把目标渲染出来。这一过程是逐个物体进行的,对于每个物体,不止GPU的渲染,引擎重新设置材质/Shader也是一项非常耗时的操作。因此每帧的Draw Call次数是一项非常重要的性能指标,而降低DC就能很好的优化我们的场景资源。下面从几个方面降低DC:

    1、降低渲染对象的数量——Occlusion Culling

    这个很显然,只要场景中需要渲染的目标数量减少了,相应的DC也就随之降低。而做到这一步我们可以使用Unity自带的遮挡剔除功能——Occlusion Culling。该功能使unity只渲染相机可见(被挡到的也不会渲染)视野范围内的物体,视野外的物体不渲染。详细可自行学习:http://bbs.9ria.com/thread-216913-1-1.html
    http://blog.csdn.net/cartzhang/article/details/52684127。务必记得把静态物体勾选上静态。

    2、降低每个要渲染对象的渲染次数——LightMap

    实时的灯光渲染会很消耗性能,所以我们可以为那些静态不动的物体预先烘焙好贴图来代替实时光照计算,这样就降低了DC,5.6版本后对全局光照系统做了很好的更新,感兴趣可以学习一下:http://gad.qq.com/program/translateview/7187820。烘焙LightMap的时候记得一定把静态的物体勾选上LightMap Static,,所有静态选项都勾选也可以:

    Paste_Image.png
    3、批处理——Batching

    批处理的意思就是处理多个物体,以此减少DC,批处理分为两种:静态批处理和动态批处理。这里只详细介绍一下静态批处理,因为动态批处理我没用到,所以怕理解有误,详细可阅读:http://blog.csdn.net/qinyuanpei/article/details/48262583
    静态批处理的前提条件:物体是静态不能移动的,拥有同一种材质的,记得勾选静态:

    Paste_Image.png
    再说一下Batches这个东西:
    Paste_Image.png
    上面的小窗口视图是在Game视图的右上角点开的。
    其中Batches——合并后的DrawCall次数。
    SetPass calls——SetPass的调用次数。
    Saved by batching——被合并的DrawCall次数。
    Batches就是你要看到的DrawCall。 减少了Batches就是减少了DC。

    然后我们建个空场景,里面放上两个不同材质的物体:一个圆柱体和一个方块。如图:


    Paste_Image.png Paste_Image.png Paste_Image.png

    当没有勾选静态,没做任何处理时,batches为13,saved by batching为0,而图中圆柱体和方块的材质用的shader是同一种,只是图片和颜色不同。下面我们把它们材质中的图片都干掉,值保留不一样的颜色,如图:

    Paste_Image.png

    此时Batches变成了10,而Saved by batching变成了3。
    然后我们再进行静态批处理:把静态勾选上,给两个物体换上同一种材质(注意,是同一种材质,不只是同一种shader或图片,上面测试的就是同一种shader不同颜色),


    Paste_Image.png

    这时候静态批处理就完成了,我们可以看到Batches已经变成了8,我们再在场景中多加几个物体看看效果如何:


    Paste_Image.png
    Batches还是8,这样就达到了我们优化DC的目的。但是静态批处理也有不好的地方:会占用更多的内存,所以如何灵活运用要根据相应的项目需求了。
    我在查找资料的时候有看到说静态批处理和遮挡剔除有冲突,说因为静态批处理时相机只要看到物体的一个像素点就会把整个物体渲染出来,而遮挡剔除此时只会渲染看到的像素点,不会渲染那些不可见的。但是我没有深入研究,感兴趣的老铁可以研究一下。
    4、特效的优化

    直接附上链接,https://blog.csdn.net/github_32062421/article/details/49203501,这个优化在移动端项目中很重要,我的项目中就有很多特效,优化过后帧率提高了也稳定了很多。

    5、LOD技术

    直接上链接,http://blog.csdn.net/yuxikuo_1/article/details/48795325,这个我的项目中没用到,但是以后可能会在其它项目中用到,很好用的组件

    6、地形的Draw

    unity有自带的地形组件,但是不提倡使用,建议让模型美术那边做一个地形的模型,因为unity的地形组件真的耗性能:


    Paste_Image.png Paste_Image.png

    虽然不勾选地形的细节渲染可以降低了很多Batches,但是一般移动端的Batches不超过100为好,一个空地形就占了将近70(一个天空盒也会占2个batches),所以移动端不推荐使用unity自带的地形组件。

    二、脚本优化

    脚本优化,附上链接http://blog.csdn.net/u014779452/article/details/48395921
    http://blog.csdn.net/sw521314/article/details/75333025
    还要合理利用对象池。

    相关文章

      网友评论

        本文标题:场景优化的学习

        本文链接:https://www.haomeiwen.com/subject/aydelxtx.html