本文的主要目的是学习减少Draw Call来使你的游戏帧率更高
在游戏开发的某个阶段,我们都会遇到这些问题。我们会试着分析新的图形技术、新的图像压缩技术、新的代码以及一些其他技术。因此,这让我们牺牲了很多宝贵时间,而在最后的最后,或许我们解决了一些棘手的问题亦或是放弃了这些新技术。 在这里,我们会尽量减少这样的常见错误以及缩短困难期。其实我更愿意说忽视Draw Call是粗心大意而不是一个错误。
Draw Call仅仅是一条指令!Draw Call指令从CPU传到GPU,渲染一个网格。指令只指向一个被渲染的网格并且不包含任何材质信息。(请容忍我一段时间,我保证后面的会更容易理解一些:D)
在发出指令后,GPU的渲染状态值(材质、纹理、shader等)和所有的顶点数据通过神奇的代码转化为以一个信息,然后再在你的屏幕上呈现出美丽的画面。 渲染就是在做一个巨大数量的小任务,比如计算成千上万的顶点和在屏幕上绘制以百万计的像素。
每个用不同的材料的网格都需要一个单独的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
|