cpu,gpu不是同时对于同一帧进行处理的,cpu首先处理A帧,然后交给绘制线程,此时cpu去处理B帧,而gpu负责渲染。
一开始cpu要计算所有模型的位置,以及变换信息等等,这个过程非常复杂。
然后要计算哪些对象或者内容是可见的,这样就可以只渲染可见的部分(因为渲染所有对象太慢了),计算完后会简历两个列表,一个列表存储所有可见的对象,另一个列表存储所有不可见的对象,这个过程大多由CPU完成。
这个过程分为四步:
1,距离剔除(Distance Culling)
2,视锥体剔除(Frustum Culling)
3,预计算可见性(Precomputed Visibility)
4,遮挡剔除(Occlusion Culling)
1,距离剔除:当从远处向近处拉镜头的时候,会看到有物体消失的效果。(类比和平精英中,远处的物体看不见,但是开车开着开着就能看见山和房子了,这样)。UE4会自动进行一个检查,看一个物体是否超出了X距离,如果超过了,那就不渲染它。它在下一帧中,就不会被渲染。它不仅适用于物体,还适用于粒子。(默认不开启)
2, 在第一人称的时候,摄像头会有一个视角,超出这个视角的物体则不会被渲染。举例:如果现在是一个第一人称的游戏,我们的背后有物体,这个物体就不会被渲染。(默认开启且无法被禁用)
3,在渲染前,会预先计算哪些物体是被遮挡的,如果被遮挡了,就不渲染这个物体。而是否可以被渲染,可以由蓝色的单元格告知。
4,计算每一个模型的被遮挡性,被遮挡住的物体不渲染。这种方式会检查每一个对象是否被挡住了。
上述四种方法的损耗递增。
遮挡性能的影响:
1,开启距离剔除
2,场景中如果有超过1万个对象,可能就会产生影响
3,大型的开放场景,遮挡性能不会很好(引擎要渲染的东西太多了)
4,几乎任何可见对象都可以被遮挡,粒子也可以被遮挡
5,大型模型很少被遮挡,所以会影响GPU性能
6,把模型组合为大型模型,会影响CPU性能
那一个大型的物体为什么要分为很多个组合的小模型呢?因为小模型多会增加遮挡计算的计算量啊?
如果使用一个大型模型,需要检测遮挡的对象的确会变少,但是另外一方面说,要渲染的物体多了。因为这样需要渲染的物体实际上就变多了,会渲染很多我们看不见的物体,这是一种浪费。