Unity优化大全(七)之 GPU-几何体和显存宽带

时间:2021-02-25 06:04:39

前言:

    在前面讲了下GPU的动态阴影和Shader方面的优化,这里在谈谈几何体和显存带宽的优化吧!


进入主题:


几何体优化:

   

      首先讲下几何体的优化方法吧,这里的几何体优化主要是讲下几何体的顶点优化!如下:

  • 尽可能减少模型中三角形的数目,一些对于模型没有影响、或是肉眼非常难察觉到区别的顶点都要尽可能去掉。
  • 尽可能重用顶点。在很多三维建模软件中,如3DMax,Maya都有相应的优化选项,可以自动优化网格结构。
  • 使用LOD(Level of Detail),好处就是对那些离得远,看不清的物体的细节可以忽略。
  • 遮挡剔除(Occlusion culling)。
  • 尽可能使用灯光映射(LightMapping)来代替实时灯光(在质量设置中调整像素灯光的数量。只有平行光应该是逐像素(Important)的,其他所有都应该是逐顶点的。当然,这取决于游戏)当然5.0的新版本的很好的可以实现全局的实时光照哦!
   ......           在这里笔者会着重讲下LOD(细节等级)和遮挡剔除(Occlusion culling)主要目的都是为了减少绘制调用的数目,LOD技术有点类似于Mipmap技术,不同的是,LOD是对模型建立了一个模型金字塔,根据摄像机距离对象的远近,选择使用不同精度的模型。它的好处是可以在适当的时候大量减少需要绘制的顶点数目。它的缺点同样是需要占用更多的内存,而且如果没有调整好距离的话,可能会造成模拟的突变,具体做法如下图所示:        Unity优化大全(七)之 GPU-几何体和显存宽带     

Unity优化大全(七)之 GPU-几何体和显存宽带


Unity优化大全(七)之 GPU-几何体和显存宽带

Unity优化大全(七)之 GPU-几何体和显存宽带


你可以通过滚动鼠标来观察定点数和面数的变化


遮挡剔除(Occlusion culling)

       充填率、像素以及几何体的复杂度(顶点数量)绑定了图形性能。如果你可以找到一个方法来剔除更多的渲染,那么这三点就可以被降低。遮挡剔除就可以做到这一点。Unity会自动剔除视见平截头体之外的对象。那么你还要注意一点:每当相机在遮挡区域之外,遮挡剔除将不应用。重要的是这种遮挡区域覆盖的地方要有相机,但做遮挡区域太大,会导致烘焙更多开销。如图所示:


启动Occlusion culling前

Unity优化大全(七)之 GPU-几何体和显存宽带


启动Occlusion culling后,如下图:

Unity优化大全(七)之 GPU-几何体和显存宽带


       看到没,顶点数和面数明显下降!DC也减少了1!不仅优化了GPU,还有优化了CPU,那它是不是很完美了??错!几乎不存在完美的解决方案!看到左下角那个遮挡数据的大小就知道了,做遮挡区域太大,遮挡的数据也会相应的变大,虽然变化和细微,但是会导致烘焙更多的开销去烘培!而且使用的Memory也略微的变大!如下图:

Unity优化大全(七)之 GPU-几何体和显存宽带Unity优化大全(七)之 GPU-几何体和显存宽带


具体的Occlusion culling的属性请见链接地址:http://game.ceeger.com/Manual/OcclusionCulling.html


LightMapping:

    这个实验起来很简单,我这里直接给出实验后的图片哦,如图所示:

开启前:

Unity优化大全(七)之 GPU-几何体和显存宽带

开启后:

Unity优化大全(七)之 GPU-几何体和显存宽带


显存带宽优化:

    在这里主要使用压缩图片来减小显存带宽的压力,相应的优化措施如下:

  • OpenGL ES 2.0使用ETC1格式压缩等,在打包设置那里都有,图片宽高最好是2的整数幂
  • 使用MipMaps。
  • 利用缩放。

  ......

         先说说MipMaps,效果图如下所示:

Unity优化大全(七)之 GPU-几何体和显存宽带

上面是一个mipmap 如何储存的例子,左边的主图伴有一系列逐层缩小的备份小图(为了更好让大家理解,在网上摘取了一张图片)

    Mipmap中每一个层级的小图都是主图的一个特定比例的缩小细节的复制品。因为存了主图和它的那些缩小的复制品,所以内存占用会比之前大,具体是约增加了33%。但是为何又优化了显存带宽呢?因为可以根据实际情况,选择适合的小图来渲染。所以,虽然会消耗一些内存,但是为了图片渲染的质量(比压缩要好),这种方式也是推荐的。

       再说说利用缩放来减少显存带宽吧。

      很多时候分辨率也是造成性能下降的原因,尤其是现在很多国内山寨机,除了分辨率高其他硬件简直一塌糊涂,而这恰恰中了游戏性能的两个瓶颈:过大的屏幕分辨率+糟糕的GPU。因此,我们可能需要对于特定机器进行分辨率的放缩。当然,这样会造成游戏效果的下降,但性能和画面之间永远是个需要权衡的话题。


在Unity中设置屏幕分辨率可以直接调用Screen.SetResolution。实际使用中可能会遇到一些情况,在这里雨松MOMO有一篇文章讲了这种技术,可以去看看,链接地址:http://www.xuanyusong.com/archives/3205

最后的最后:

       我觉得大家还是自己动手试试更好,笔者就是个和很爱动手去实践的人哦!如果大家还有其他好方法就在下面留言哦,谢谢大家了!Unity优化大全(七)之 GPU-几何体和显存宽带