早岁已知世事艰,仍许飞鸿荡云间。 一路寒风身如絮,命海沉浮客独行。
Unity的各种批处理方式是每一位Unity开发者都需要掌握的一环,就比如说客户端的面试就会常常考察你对静态合批和动态合批的理解(一般重点会问UGUI),而SRP Batcher和GPU Instance则是对Unity批处理更深层次的理解,也是渲染的基本功。本文章将结合案例为大家深入讲解这几种批处理方式。
Draw Calls介绍¶
要了解批处理,最最最重要的是要明白DrawCalls是什么。 举个例子,当我们在渲染管线的应用阶段时,CPU中准备好一块数据(比如网格、纹理、颜色、变换矩阵等),将其发送到GPU提供进行几何处理,这样一个过程就叫做DrawCall。
正常情况,一个彩色小球每帧绘制时就会执行一次DrawCall,一百个小球那就是100个DrawCall。
批处理介绍¶
而对于渲染管线而言,DrawCall往往会占用很多时间,往往比后续GPU全部处理一次的事件还长。所以我们就要对DrawCall进行优化!!! 减少它在渲染管线中的消耗!!!
那么有人问了,博主博主,你的DrawCall确实强,但是还是太吃操作了,有没有更加性能的优化推荐下?
有的兄弟有的,这么强的优化Unity还有四个,他们分别是: - 动态合批:运行时合并统一材质的网格,让多个物体网格合并后再处理数据,一次性进行DrawCall,从而减少整体DrawCalls次数。 - 静态合批:和动态合批毕竟相似,但是需要提前选定相关物体,在构建前进行合批,减少运行时消耗,但是合并出的大网格会单独占用一部分内存。 - SRP Batcher:本身并不会减少DrawCalls数量,但是它会将Shader相关数据存到显存中,从而减少每个DrawCall的消耗。 - GPU Instance:适用于大量相同网格的物体,能将其数据以数组方式存储到显存中,一次性全部设置。
闲言碎语¶
之前去大厂做客户端实习了一圈,太久没更新了,同时上班上学也没力气更新了...最近离职后时间才稍微充裕点,也准备重新写点东西沉淀一下~学到的东西倒也蛮多的,但是越学越发现游戏开发知识的深邃与广泛,我自己目前搭了一个笔记网站可以供大家学习:晶尘CryDust's Blog
最近还是打算挑战下引擎相关的实习岗,后续还是会同时更新图形学和游戏客户端开发的相关文章,也欢迎大家加群交流相关技术。