分享

如何通过减少Draw Call使你的游戏运行的更快

 阿修罗之狮猿授 2016-07-04

本文的主要目的是学习减少Draw Call来使你的游戏帧率更高


  • 尽管图形是如此简单,为什么我的游戏延迟这么多? 

  • 为什么我的游戏加载时间如此之高? 

  • 为什么屏幕之间的切换如此之慢?

  • 为什么我游戏的FPS一直很低?

  • 我已经压缩过纹理贴图和精灵了,怎么还那么大?

  • 为什么我的游戏总会崩溃?

  • 为什么我的游戏那么费电?

  • 为什么在手机上运行我的游戏时,手机发热怎么会那么严重?

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

Draw Calls是什么?


Draw Call仅仅是一条指令!Draw Call指令从CPU传到GPU,渲染一个网格。指令只指向一个被渲染的网格并且不包含任何材质信息。(请容忍我一段时间,我保证后面的会更容易理解一些:D)

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


注意


每个用不同的材料的网格都需要一个单独的Draw call。 

Draw Call是如何影响我们游戏的?


让我来举个容易理解的例子。下面,我们用一个简单的UI面板来帮助你理解这个概念。

步骤1)按你的喜好创建UI


我已经创建好了,如下图所示:



 

就像你看到的那样,这是个有少量圆形和矩形的基本界面。

我使用了如下精灵



 

步骤2)检查Draw Calls


运行游戏,并点击Game视图中的stats按钮



 

如下图所示,你会看到游戏在运行时的一些渲染数据。



 

这里,Batches是个重要的指标。需要注意的是,Batches值越低,Draw Calls就越低。

步骤3)打开帧调试窗口


注意这个功能只有在
Unity5.0以上版本才有。



 

下面是Unity官方文档的介绍


“帧调试器可以让你冻结回放运行中游戏的某一帧,然后看那一帧渲染的draw calls。和列出draw calls一样,帧调试器也允许你逐帧调试,所以你可以看到场景如何从它的图形元素构建的大量细节”

那么让我们通过点击帧框架上的“Enable”按钮来分析一下draw calls吧。



点击激活frame就会被暂停并显示要求我们画一块屏幕。


在我的例子中,它是十个batches,并且根据你屏幕会看到不同数量的Batches

你可以滚动浏览每个Draw Call去查看每个生成的屏幕结果。

OK!我能看到一些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提供一个雪碧包实用工具,它可以将单独的精灵纹理自动打包成一个图集”


现在我们将演示一个将多个精灵打包成图集的Demo。


步骤1)选择你想要的打包的精灵


理想的UI,应该将屏幕上的所有UI元素打包到一个单独的表中。

步骤2)給这个包一个标签,如下图所示:



 

这里,我命名为MainScreen,你可以命名你喜欢的名字。

步骤3)打开Sprite Packer窗口并整理

下图就是Sprite Packer窗口



 

点击Pack按钮

根据包名标签会将大量纹理打包到此一个图集中。


你可以通过下拉菜单查看图集上的图片。


如果纹理贴图没有打包到一个图集,他们会被分到一个子页。


你可以选择打包的算法。

步骤4)运行游戏!


你看到改变了吗?


查看stats选项卡的Batches值。



 

我的batches从一开始的10降到了3!这减少了7个Draw Call!这意味着渲染能力提高了两倍!同时也降低了GPU负担!


想象一下实际情况,从500降低到200是一个巨大的提升!特别是对移动端来说!减少CPU的负担的同时让其他程序正常运行。


这对渲染是个巨大的提升!(译者注:感觉这个Demo的铺垫好长啊QAQ)


这对渲染是个巨大的提升!(译者注:感觉这个Demo的铺垫好长啊QAQ)

原文作者:Rudra Gesota
原文链接:http://www./blog/learn-draw-call-reduction-and-make-your-games-run-superfast

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多