查看: 5193|回复: 1

[渲染] Unity3d游戏场景批处理定义及分类

[复制链接]

28

主题

31

听众

285

积分

小学生

Rank: 2

升级   28.33%

发表于 2015-11-23 17:41 |显示全部楼层
共享资源可获取更多积分,所有资源仅供参考学习研究!

一、什么是批处理?
我们知道Unity 3D在屏幕上绘制一个图形本质上调用OpneGL或者DirectX这样的API,因此在这个过程中会产生一定程度上的性能消耗。DrawCall是OpenGL中描述绘制次数的一个量,例如一个基本的OpenGL绘制流程是设置颜色->绘图方式->顶点坐标->绘制->结束,在绘制的过程中每帧都会重复这个过程,这就是一次DrawCall;
所以当游戏中的绘制过程变得复杂的时候,就会带来DrawCall的急剧增加,进而带来游戏的性能问题,反映到游戏表现上就变成了优化问题。那么在Unity3D中采取了什么样的措施来降低DrawCall呢?这就是我们今天要说的批处理,换句话说Unity3D使用了批处理来达到降低DrawCall的目的,批处理希望通过对物体网格的重组来获得更高的绘制效率,
试想以下如果将多个物体合并为一个物体,那么在绘制的时候只需要绘制一次就够了,因此从这个角度上来讲这样做肯定是可以降低DrawCall的,更深刻的一种理解是这里体现了一种资源循环调用的思想,接触过Android开发的朋友们一定知道ListView控件可以对其元素进行“缓存”从而提高效率,因为我们可以发现其实ListView是对列表项进行某种程度上的“复用”从而提高了效率,在Unity3D这里同样遵循了这个原理。
在Unity3D中进行批处理的一个前提是相同材质的物体可以被合并,如果这些物体使用不同的材质,那么当我们把这些材质对应的纹理打成“图集”以后可以对其进行合并,并且在合并的时候应该是用Renderer.sharedMaterial 而非 Renderer.material以保证材质是可以共享的。
在Unity3D中有静态批处理和动态批处理两种方式,下面我们就来分别说说这两种不同的批处理方式!
静态批处理
静态批处理其实大家都是知道的。为什么这样说呢?因为我们在使用Unity3D的过程中无形中培养了这样一个习惯,那就是将场景中相对来说“静态”的物体都勾选Static选项,这在Unity3D中称为Static GameObjects,并且因为这一特性和Lightmapping、Navigation、Off-meshLinks、ReflectionProbe、Occluder and Occludee等内容均有着密切的联系。
静态批处理允许游戏引擎尽可能多的去降低绘制任意大小的物体所产生的DrawCall,它会占用更多的内存资源和更少的CPU资源,因为它需要额外的内存资源来存储合并后的几何结构,如果在静态批处理之前,如果有几个对象共享相同的几何结构,那么将为每个对象创建一个几何图形,无论是在编辑器还是在运行时。这看起来是个艰难的选择,你需要在内存性能和渲染 性能间做出最为正确的选择。
在内部,静态批处理是通过将静态对象转换为世界空间,并为它们构建一个大的顶点+索引缓冲区。然后,在同一批中,一系列的“便宜”画调用,一系列的“便宜”,几乎没有任何状态变化之间的。所以在技术上它并不保存“三维的调用”,但它可以节省它们之间的状态变化(这是昂贵的部分)。使用静态批处理非常简单啦,只要勾选物体的Static选项即可!
动态批处理
相对静态批处理而言,动态批处理的要求更为严格一些,它要求批处理的动态对象具有一定的顶点,所以动态批处理只适用于包含小于900个顶点属性的网格。如果你的着色器使用顶点位置,法线和单光,然后你可以批处理300个顶点的动态对象;而如果你的着色器使用顶点位置,法线,uv0,UV1和切线,那么只能处理180个顶点的动态对象。
接下来最为重要的一点,如果动态对象使用的是不同的材质,那么即使进行了动态批处理从效率上来讲并不会有太大的提升。如果动态对象采用的是多维子材质,那么批处理是无效的。如果动态对象接收实时光影,同样批处理是无效的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

楼主热帖

0

主题

30

听众

204

积分

小学生

Rank: 2

升级   1.33%

发表于 2017-3-2 17:18 |显示全部楼层

不错 不错 不错
回复

使用道具 举报

0

主题

30

听众

201

积分

小学生

Rank: 2

升级   0.33%

发表于 2017-5-13 12:52 |显示全部楼层
楼主是超人
回复

使用道具 举报

0

主题

30

听众

201

积分

小学生

Rank: 2

升级   0.33%

发表于 2017-5-13 13:24 |显示全部楼层
好帖就是要顶
回复

使用道具 举报

0

主题

30

听众

200

积分

小学生

Rank: 2

升级   0%

发表于 2017-5-13 13:03 |显示全部楼层
顶顶多好
回复

使用道具 举报

0

主题

30

听众

202

积分

小学生

Rank: 2

升级   0.67%

发表于 2017-5-13 13:09 |显示全部楼层
不错不错
回复

使用道具 举报

0

主题

30

听众

200

积分

小学生

Rank: 2

升级   0%

发表于 2017-5-13 13:26 |显示全部楼层
LZ真是人才
回复

使用道具 举报

0

主题

30

听众

200

积分

小学生

Rank: 2

升级   0%

发表于 2017-6-10 11:42 |显示全部楼层
很不错
回复

使用道具 举报

0

主题

30

听众

203

积分

小学生

Rank: 2

升级   1%

发表于 2017-6-10 11:50 |显示全部楼层
真心顶
回复

使用道具 举报

0

主题

30

听众

204

积分

小学生

Rank: 2

升级   1.33%

发表于 2017-6-10 12:13 |显示全部楼层
难得一见的好帖
回复

使用道具 举报

温馨提示:求助请到“Unity技术讨论”版块中发帖,便于集中解决!
您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐 上一条 /1 下一条

Unity3D游戏开发联盟(资源共享平台) -Unity3D,Unreal ( 粤ICP备20003399号 )

GMT+8, 2020-9-30 16:14 , Processed in 0.106442 second(s), 38 queries .