如何减少游戏中drawcall

https://blog.csdn.net/yupu56/article/details/50177935

尽管图形是如此简单,为什么我的游戏延迟这么多? 
为什么我的游戏加载时间如此之高? 
为什么屏幕之间的切换如此之慢?
为什么我游戏的FPS一直很低?
我已经压缩过纹理贴图和精灵了,怎么还那么大?
为什么我的游戏总会崩溃?
为什么我的游戏那么费电?
为什么在手机上运行我的游戏时,手机发热怎么会那么严重?

在游戏开发的某个阶段,我们都会遇到这些问题。我们会试着分析新的图形技术、新的图像压缩技术、新的代码以及一些其他技术。因此,这让我们牺牲了很多宝贵时间,而在最后的最后,或许我们解决了一些棘手的问题亦或是放弃了这些新技术。
在这里,我们会尽量减少这样的常见错误以及缩短困难期。其实我更愿意说忽视Draw Call是粗心大意而不是一个错误。

Draw Calls是什么?
Draw Call仅仅是一条指令!Draw Call指令从CPU传到GPU,渲染一个网格。指令只指向一个被渲染的网格并且不包含任何材质信息。

drawcall是啥?其实就是对底层图形程序(比如:OpenGL ES)接口的调用,以在屏幕上画出东西。所以,是谁去调用这些接口呢?CPU。


在发出指令后,GPU的渲染状态值(材质、纹理、shader等)和所有的顶点数据通过神奇的代码转化为以一个信息,然后再在你的屏幕上呈现出美丽的画面。
渲染就是在做一个巨大数量的小任务,比如计算成千上万的顶点和在屏幕上绘制以百万计的像素。
注意
每个用不同的材料的网格都需要一个单独的Draw call。 

用Unity引擎开发,我们就要了解它们的工作机制,这样在项目进行优化时也会有针对性,关于优化方面,笔者也做过一些视频讲座,当然这些系列文章是视频中没有的,Unity首先遇到的问题就是效率问题,很多项目由于效率问题夭折了,所以这个问题的解决非常重要,如何优化效率也就是运行帧率,针对于Unity就是减少Draw Call的数量。

 网上关于Draw Call的介绍非常多,这里再给读者向细的方向讲一下,其实Draw Call的执行就是CPU与GPU之间的通信,这就涉及到渲染流水线的概念,渲染流水线的起点是CPU,主要分三个阶段:

1、CPU把数据加载到显存中

2、设置渲染状态

3、调用Draw Call

 

正如我之前所说的,这取决于你的硬件水平,即使它是一个简单的UI,也可能用了10个Draw Call去画满整个屏幕

现在想象一下一个完整的游戏需要多少Draw Call?

大量的Draw Call会在每一帧生成成千上万的网格。很明显减少它们将减少GPU开销。

“现代桌面级游戏可以每帧处理500-5000 draw call。而移动端大约只能处理40到60个,最新的移动设备则可以处理120到160个draw call”

所以draw call会成为一个很大的瓶颈!记住帧率既是王道!!

如果你的帧率很好,不需要担心craw call。
大量的Draw Call会严重影响硬件的表现,并且每一帧都需要完成Draw Call

噢...我现在知道了,Draw Call是罪魁祸首,但怎么解决呢?

幸运的是,在unity中有一个叫Sprite Packer的工具救了我们!

Unity官网原话:“为了获得最佳性能,最好将几个精灵纹理打包在一起成为一个图集。Unity提供一个雪碧包实用工具,它可以将单独的精灵纹理自动打包成一个图集”

关于减少drawcall的方法,可以总结出来:

  1. 使用Draw Call Batching,也就是描绘调用批处理。Unity在运行时可以将一些物体进行合并,从而用一个描绘调用来渲染他们。具体下面会介绍。
  2. 通过把纹理打包成图集来尽量减少材质的使用。
  3. 尽量少的使用反光啦,阴影啦之类的,因为那会使物体多次渲染。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章