Unity Shader学习笔记——Draw Call

  流程讲完了在细说一下drawcall,上面已经说到了drawcall就是CPU调用图像编程接口,命令GPU进行渲染的操作,drawcall中造成性能问题的元凶是CPU。

        CPU和GPU是如何并行工作的?   

        通过命令缓冲区,由CPU向其中添加命令,而GPU从中读取命令,两者是互相独立的。

        为什么Draw Call多了会影响帧率? 

        因为每次调用 drawcall之前,CPU需要向GPU发送很多内容,包括数据、状态、命令。在这一阶段中CPU需要完成很多工作,例如检查渲染状态,当CPU完成了这些准备工作,GPU就可以开始本次本次渲染,GPU渲染能力很强,渲染200个和2000个三角网格通常没什么区别,因此渲染速度往往快于CPU提交命令的速度。如果drawcall数量太多,CPU就会把大量时间花费在提交drawcall上,造成CPU过载。

        如何减少Draw Call?

        使用批处理。提交大量很小的drawcall会造成CPU把大量时间花费在准备drawcall上,那么优化就是把很多细小的drawcall合并成一个大的drawcall,这就是批处理的思想。

        批处理又分为两种,动态批处理和静态批处理。

        静态批处理就是将静态的不会动的物体进行批处理。例如大地,石头等,对于这些静态的物体我们只需要合并一次,并且他们拥有相同的纹理;如果是不同纹理的话,可以打包成图集;或者是光源上减少反射光,减少阴影面积。

        动态批处理,指的是Unity的动态,Unity自身对相似的资源进行动态批处理,有非常严苛的要求,要改很多资源。且这些物体是不断移动的,因此每一帧都需要重新进行合并在发送给GPU。所以批处理更适合静态的物体。

扫描二维码关注公众号,回复: 14761653 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_45081191/article/details/129164580