几何结构渲染一"/>
UE4实时渲染——几何结构渲染一
上一节:UE4实时渲染——渲染前和遮挡
上一节Draw线程准备好了一些对象,这些对象是当前一帧对象我们可见的,现在我们要使用GPU线程逐对象来渲染了。
首先我们要考虑的,就是渲染对象的顺序,我们不能单纯的像粉刷墙画那样,先刷上一层背景,再刷上面的图案,这会导致图案和背景重叠的部分,会重复绘制2次,如果在N多个对象的场景中,这种绘制无疑是性能的浪费。
我们的办法是依靠前期的深度(Z)通道,做一个深度测试,当渲染几何体时,他会先做一次预通道,确定下来其中一些像素点的值会被另一个模型的像素所覆盖,所以在渲染背景时,他就不会渲染这部分像素点。
预通道设置我们没办法插手太多,设置开启即可。
现在我们开始渲染具体的几何体,几何体会根据绘制调用(drawcall)来逐个渲染。
本节的接下来会重点介绍这个功能,绘制调用drawcall。
绘制调用(drawcall)是指渲染时采用的单一处理过程,可以理解为,有相同属性(材质等)的一组多边形或对象。
比如:
左右两图都有三种元素需要绘制,天空、地面、圆柱体,
区别是,左图只需要绘制5次,而右图由于第三个圆柱体是由两种材质构成,所以需要绘制6次。
每一种新的材质,便要一次新的绘制调用drawcall。
这也就能解释,drawcall会成为最大的性能损耗了,所以如果想在这里获得高性能,就要使绘制调用的次数合理化。
右图的实际渲染顺序如下:
引擎把它们按材质分类组合。我们可以看到三根柱子同材质部分,会依次渲染,然后再绘制其他材质的柱子、其他材质的对象。
有一个常用的命令“stat RHI”(rendering head interface渲染头接口),用来查看当前渲染三角形次数、渲染对象个数等信息。打开后如图:
Trangles drawn:616212
绘制了约62万个三角形
DrawPrimitive calls:1091
绘制调用drawcall了1091个对象
开启光照会对这个数值产生影响,当开启光照时,绘制调用对象和三角形数量会变多:
如下:
三角形数量变为80万左右,绘制调用次数变为1131个左右
但不要太纠结这个所显示的渲染数量,和你在UE4中看到的对象数量的差别,它背后的计算过程我们是看不到的,所以有出入属于正常。
但有个对照表,可以帮助我们明确是否渲染需要优化。
绘制调用次数 | 状态 |
---|---|
2000-3000 | 正常 |
5000+ | 过高 |
10000+ | 可能会导致问题(取决于硬件以及你用这个做了什么) |
一般来说,在可移动设备(手机、VR等)上的绘制调用次数,通常只有几百次最多一千次左右。
drawcall绘制调用,是极其影响性能的因素,每一次渲染器完成绘制调用时,它都要再次接收从渲染线程发来的命令,从而增加损耗。
drawcall绘制调用的影响,在很多情况下已经大于“多边形面数”了,之前我们总是关注渲染多边形有十几万个,其性能消耗之大,但现在我们应该多关注drawcall,因为它的性能消耗不会比渲染多边形要少。
我们可以举一个例子来说明这个性能消耗的比较,比如在PC计算机上,
文件夹及内容 | 总大小 | 复制耗时 |
---|---|---|
文件夹中有1GB的1个文件 | 1GB | 几分钟 |
文件夹中有1KB的1百万个文件 | 1GB | 一两天 |
这和计算机复制文件的流程是有关的,它每次复制完都要再询问并获取下一个复制文件,同理,这也就是为什么drawcall绘制调用的性能消耗如此之大了,这和有多少三角形面片关系并不大。
再比如有这样的情况:
8600万相同材质三角形,3000次drawcall绘制调用,帧率为33fps
10万个不同材质三角形,44000次drawcall绘制调用,帧率为4fps
15万7000个相同材质三角形,186次drawcall绘制调用,帧率为236fps
这是因为第二幅图中,每一个三角形的材质都不同(如下图显示),如上面介绍的那样,这将会导致每绘制一种材质的三角形,就会调用一次drawcall绘制调用,也就是:渲染->停下->等待->渲染->停下->等待……
总结:
1、绘制调用drawcall对于损耗的影响,会比多边形数量更大。
2、根据你的设置和运行方式,5万三角形可能比5千万的运行效果还差。
3、绘制调用drawcall有基本损耗,所以把低面数模型改为超低面数模型可能不会有太大的改进。
下一节:UE4实时渲染——几何结构渲染二
更多推荐
UE4实时渲染——几何结构渲染一
发布评论