本文转自:http://blog.csdn.net/lyh916/article/details/45725499,请点击链接查看楼主大神原文,尊重楼主版权。

参考链接:Unity圣典:http://www.ceeger.com/Script/Mesh/Mesh.CombineMeshes.html

一、批处理

1.批处理的目的就是为了减少DrawCall。DrawCall即CPU命令GPU去绘制。

2.如果我们需要渲染一千个三角形,那么把它们按一千个单独的网格进行渲染所花费的时间要远大于直接渲染一个包含了一千个三角形的网格。

3.要想使用批处理,需要物体有相同的材质。这是因为,对于使用同一个材质的物体,它们的不同仅仅在于顶点数据的差别,我们可以把这些顶点数据合并在一起,再一起发送给GPU,就可以完成一次批处理。

4.在unity中,有两种批处理:一是动态批处理,二是静态批处理。

对于动态批处理,unity会自动完成,不需要我们进行操作,而且物体是可以移动的,但是动态批处理有许多限制条件。
对于静态批处理,物体不可移动,但是限制条件很少。

二、动态批处理

原理:每一帧把可以进行批处理的模型网格进行合并,再把合并后模型数据传递给GPU,然后使用同一个材质对其渲染。

限制:

1.顶点属性要小于900。例如,如果shader中需要使用顶点位置、法线和纹理坐标这三个顶点属性,那么要想让模型能够被动态批处理,它的顶点数目不能超过300。因此,优化策略就是shader的优化,少使用顶点属性,或者模型顶点数要尽可能少。

2.多Pass的shader会中断批处理。

3.在unity5中,动态批处理对于模型缩放的限制已经不存在了。

4.使用光照纹理的物体需要小心处理。为了让这些物体可以被动态批处理,需要保证它们指向光照纹理中的同一位置。

三、静态批处理

原理:只在运行开始阶段,把需要进行静态批处理的模型合并到一个新的网格中,这意味着这些模型数据不可以在运行时刻被移动。

优点:因为它只需要进行一次合并操作,因此比动态批处理更加高效。

缺点:需要占用更多的内存来存储合并后的几何结构。

操作:将Inspector面板右上角的Static勾选(实际上只需要勾选Batching Static即可)

四、DrawCall

渲染统计窗口

Batches:相当于DrawCall

Saved by batching:通过批处理节省的DrawCall

SetPass calls:跟Shader中Pass的数量有关,Pass越多这个越大

Ps:当对场景中的物体进行修改时,有时需要点击一下Game视图,渲染统计窗口才会刷新。

五、影响DrawCall的因素:

1.Pass数量

新建一个场景,将天空盒改为纯色,将平行光的阴影类型改为无。此时Batches值为1,当禁用相机时,值为0。

新建一个cube,新建一个材质和三个shader,其中OnePass含一个Pass,TwoPass含两个,ThreePass含三个。将OnePass给材质,材质给cube。

然后依次将TwoPass和ThreePass给材质。

可以看出,Pass越多DrawCall越大。可以通过FrameDebugger来查看DrawCall,当然也可以用Profiler,但后者不能查看DrawCall的具体情况。

2.材质

a.在场景中放三个cube,cube材质为一个pass

结论:经过动态批处理后,相同材质的物体只占一个DC

b.将上面的cube改为Capsule

结论:对于顶点数太多的物体,无法进行动态批处理,无法减少DC

c.场景放两个不同材质的cube

结论:不同材质的物体,无法进行动态批处理,无法减少DC

d.针对b情况,勾选Static,然后点击运行(不运行就无法查看静态批处理结果)

结论:对于顶点属性太多的物体(>900),可以使用静态批处理来减少DC

合并之后的网格

e.那么对于d,再添加一个不同材质的Sphere,勾选Static

结论:不同材质的物体,无法通过静态批处理减少DC。但是静态批处理可以通过合并网格来提高性能。

六、合并网格

创建一个空物体,确保缩放为(1,1,1),在空物体下随便创建一些物体。Ps:要使合并后不变形,就要确保根物体的缩放比例为(1,1,1)

添加以下代码到空物体上。

此处请查看原文

关于CombineMeshes:

void CombineMeshes(CombineInstance[] combine, bool mergeSubMeshes = true, bool useMatrices = true);

结合网格有利于性能最优化。如果mergeSubMeshes为true,所有的网格会被结合成一个单个子网格。否则每一个网格都将变成单个不同的子网格。如果所有的网格共享同一种材质,设定它为真。如果useMatrices为false,在CombineInstance结构中的变换矩阵将被忽略。

 

Unity动态批处理和静态批处理学习的更多相关文章

  1. unity静态批处理原理理解

    今天主程给我好好讲了一下静态批处理的问题,记下来的笔记心得~ 1.静态批处理的时间点 1)在游戏导出的时候,在player setting中勾选static batching,这样在导出包的时候就进行 ...

  2. Unity3d Static 静态批处理和动态批处理

    表示物体时静态的,多用于静止不动的物体,此外static有多种,有的用于烘焙,有的用于遮挡剔除 物理效果是rigidbody组件,和这个没关系,用transform.Translate 无法移动,因为 ...

  3. [Unity优化]批处理03:静态批处理

    原理: 运行时,把需要进行静态批处理的网格合并到一个新的网格中.虽然只进行一次合并操作,但是会占用更多的内存来存储合并后的网格,并且被静态批处理的物体无法移动旋转缩放 要使用静态批处理,需要把Stat ...

  4. vert.x学习(六),动态模板与静态文件的结合

    这篇学习在动态模板里面引入css,把动态模板与静态文件结合起来使用. 编写DynamicReference.java package com.javafm.vertx.helloworld; impo ...

  5. 自己在linux上编译、链接、动态库和静态库的学习笔记

    在平常的项目中,我们都是使用公司要求的makefile.makedebug一类的文件,因此,在编译.链接.生成和链接动态库与静态库的时候,我们只是简单的使用一些已经设置的变量,只是简单的修改.添加一些 ...

  6. asp.net之动态页面和静态页面的区别

    asp.net之动态页面和静态页面的区别 当我开始接触web开发的时候,首先学到的是html.css.js这一类网页语言,通过布局可以搭建出一个静态网站,效果也跟我们上网时经常看到的一些网站一样了.于 ...

  7. Deeplearning——动态图 vs. 静态图

    动态图 vs. 静态图 在 fast.ai,我们在选择框架时优先考虑程序员编程的便捷性(能更方便地进行调试和更直观地设计),而不是框架所能带来的模型加速能力.这也正是我们选择 PyTorch 的理由, ...

  8. Android:JNI与NDK(二)交叉编译与动态库,静态库

    欢迎关注公众号,第一时间获取最新文章: 本篇目录 一.前言 本篇主要以window开发环境为背景介绍一下NDK开发中需要掌握的交叉编译等基础知识,选window系统主要是照顾大多数读者,mac ,li ...

  9. Java动态代理与静态代理以及它能为我们做什么

    相信我们在网上和平时学习和工作中或多或少都接触过Java的代理模式,经常听到什么静态代理.动态代理的一些名词.但我们是否真的很清楚这些呢?至少我在面试时,发现很多人并不很清楚. 首先代理比较好理解,就 ...

随机推荐

  1. 将自己写的组件封装成类似element-ui一样的库,可以cdn引入

    在写好自己的组件之后 第一步 修改目录结构 在根目录下创建package文件夹,用于存放你要封装的组件 第二部 在webpack配置中加入 pages与publicpath同级 pages: { in ...

  2. IPC五种通讯方式

    IPC五种通讯方式 1.管道:速度慢,容量有限,只有父子进程能通讯 2.FIFO:任何进程间都能通讯,但速度慢 3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题 ...

  3. docker部署项目,对镜像,容器的操作

    服务器上的项目访问不了,所以我去看了看容器,果然 那我就删除容器呗 :docker rm 容器id docker rm f097e24a9a0f 说明:从镜像到容器,同一个镜像构建多个运行的 Dock ...

  4. SEERC 2018 B. Broken Watch (CDQ分治)

    题目链接:http://codeforces.com/gym/101964/problem/B 题意:q 种操作,①在(x,y)处加一个点,②加一个矩阵{(x1,y1),(x2,y2)},问每次操作后 ...

  5. 为什么Object.prototype在Function的原型链上与Function.prototype在Object的原型链上都为true

    关于javascript的原型链有一个问题我一直很疑惑:为什么 Function instanceof Object 与 Object instanceof Function都为true呢? Func ...

  6. Codeforces Round #539 (Div. 1) 1109F. Sasha and Algorithm of Silence's Sounds LCT+线段树 (two pointers)

    题解请看 Felix-Lee的CSDN博客 写的很好,不过最后不用判断最小值是不是1,因为[i,i]只有一个点,一定满足条件,最小值一定是1. CODE 写完就A,刺激. #include <b ...

  7. 「NOI2019」弹跳(KD树)

    题意:w×h网格中有n个点,m条边.每条边可以从p点花费t时间到一个矩形中的任意点,求1号点到每个点的最少时间. \(1<=w,h<=n<=70000,1<=m<=150 ...

  8. Self install windows service in .NET c#

    http://stackoverflow.com/questions/4144019/self-install-windows-service-in-net-c-sharp using System; ...

  9. java常用函数

    if(null == list || list.size() ==0 ){ } list.isEmpty()和list.size()==0 没有区别 isEmpty()判断有没有元素而size()返回 ...

  10. 可以粘贴Word文档中图片的编辑器

    Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能.但是无法 ...