当前位置:   article > 正文

《Unity游戏优化》笔记(14)[21/03/11_周四][160_170]_unity gpu 细分

unity gpu 细分

目录

6.2 性能检测问题

6.2.1 分析渲染问题

6.2.2 暴力测试

6.3 渲染性能的增强

6.3.1 启用/禁用 GPU Skinning

6.3.2 降低几何复杂度

6.3.3 减少曲面细分

6.3.4 应用GPU实例化

6.3.5 使用基于网格的LOD

6.3.6 使用遮挡剔除

6.3.7 优化粒子系统


6.2 性能检测问题

6.2.1 分析渲染问题

1.CPU瓶颈测试:在不采用批处理和阴影技术的情况下,创建成千个简单的立方体对象。

2.只创建一个需要最少量DrawCall的简单对象,但使用昂贵的着色器对纹理进行数千次采样。

为了执行准确的GPU受限的性能分析测试,应在V Sync Count中禁用 Vertical Sync,否在测试数据将受到干扰。

Gfx.WaitForPresent通常用来表示CPU正在等待垂直同步完成,因此在本测试中需要禁用。

CPU的大部分时间都花在Gfx.WaitForPresent任务上,这是CPU等待GPU完成当前帧浪费的时间。

6.2.2 暴力测试

暴力测试方法,即在场景中去除指定的活动,并检查性能是否有大幅提升。如果一个小的调整导致速度大幅提升,就说明找到了瓶颈所在的重要线索。

对于CPU受限,最明显的暴力测试是降低DrawCall来检查性能是否有突然的提升。

对于GPU,有两种好的暴力测试方法,分别是降低屏幕分辨率和降低纹理分辨率,以确定是填充率受限还是内存带宽受限。

与片元着色器相比,顶点着色器的影响微乎其微。

确定应用程序时CPU受限还是GPU受限,如果是GPU受限,还应确定是前端受限或后端受限,是填充率瓶颈还是内存带宽瓶颈。

6.3 渲染性能的增强

6.3.1 启用/禁用 GPU Skinning

Skinning是基于动画骨骼的当前位置变换网格顶点的过程。启用该功能后,会将Skinning活动推送到GPU中。

6.3.2 降低几何复杂度

我们的目标是降低实际的顶点数量。

有3种方法:

1.让美术团队手动调整,生成多边形数更少的网格,或使用网格抽取工具来简化网格。

2.简单地从场景中移除网格,但这应该是最后的手段。

3.实习网格的自动剔除特性,如详细级别(LOD)

6.3.3 减少曲面细分

如果前端遇到瓶颈,却在使用曲面细分技术,就应仔细检查曲面细分是否消耗了前端的大量资源。

6.3.4 应用GPU实例化

GPU实例化利用对象具有相同渲染状态的特点,快速渲染同一网格的多个副本。

可以将动态批处理看成一种简单的GPU实例化,因为真正的GPU实例化可以节省更多的资源,并支持通过参数调整实现更多的定制化。

选中Enable Instancing复选框,可以在材质级别上应用GPU实例化,修改着色器代码,就可以引入变化。这样,就可以为不同的实例提供不同的旋转、比例、颜色等特性。

这个系统比动态批处理更加通用,因为可以更多地控制对象的批处理过程。(?)

GPUInstancing.html

6.3.5 使用基于网格的LOD

LOD指的是根据对象和相机的距离和/或对象在相机视图中占用的空间,动态地替换对象。LOD最常见的实现是基于网格的LOD。

LOD组的目的是从这些对象中生成边界框,并根据相机视野内的边界框大小决定应该渲染哪个对象。

LevelOfDetail.html

缺点:消耗磁盘占用空间、RAM和CPU;替代网格需要捆绑在一起加载到RAM中,并且LODGroup组件必须定期测试相机是否移动到新位置,以修改LOD级别。

优点显著:动态渲染较简单的网格,减少了需要传递的顶点数据量,并潜在减少了渲染对象时需要的DrawCall数量、填充率和内存带宽。

剔除组

剔除组(Culling Groups)是UnityAPI的一部分,允许创建自定义的LOD系统,作为动态替换某些游戏或渲染行为的方法。

在其最基本的层次上,剔除组系统仅仅指出,物体对相机是否可见,它们有多大。

CullingGroupAPI.html

6.3.6 使用遮挡剔除

减少填充率消耗和过度绘制的最佳方法之一是使用Unity的遮挡剔除系统。该系统的工作原理是将世界分割成一系列的小单元,并在场景中运行一个虚拟摄像机,根据对象的大小和位置,记录哪些单元对其他单元是不可见的(被遮挡)。

遮挡剔除将自动忽略视锥体剔除的对象。

因为必须为遮挡剔除启用Static标志,所以此功能不适用于动态对象。

如果为场景进行了正确的配置,遮挡剔除可以剔除不可见的对象,减少过度绘制和DrawCall数,来节省填充率。

请注意,即使对象被遮挡剔除,也必须计算其阴影,所以不会节省这些任务的DrawCall数和填充率。

6.3.7 优化粒子系统

降低粒子系统密度和复杂度非常简单:使用更少的粒子系统,生成更少的粒子,使用更少的特殊效果。

1.使用粒子删除系统

2.避免粒子系统的递归调用

Start(),Stop(),Pause(),Clear(),Simulate(),IsAlive(),默认的withChildren参数是true,显示传入false参数。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/105571
推荐阅读
相关标签
  

闽ICP备14008679号