本文转自: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. C# EPPlus 导出Excel

    一.Excel导出帮助类 /*引用NuGet包 EPPlus*/ /// <summary> /// Excel导出帮助类 /// </summary> public clas ...

  2. mysql基础篇--删除

    语法 truncate table 表名; #清空整个表的数据 delete from 表名 where 筛选条件; #按筛选条件删除数据 /* delete和truncate的区别 delete可以 ...

  3. windows 端口转发 netsh

    原文地址 listenaddress # 本地监听的ip listenport # 本地监听的端口 connectaddress # 转发请求接收的主机ip connectport # 转发请求接收的 ...

  4. 使用jdk自带的线程池。加载10个线程。

    在开发中使用线程,经常不经意间就new Thread()一个出来,然后发现,这样做不是很好,特别是很多线程同时处理的时候,会出现CPU被用光导致机器假死,线程运行完成自动销毁后,又复活的情况. 所以在 ...

  5. the schema version of 'microsoft.aspnet.mvc' is incompatible with version of nuget

    Nuget versioning issue with package restore http://stackoverflow.com/questions/12035976/nuget-versio ...

  6. js的数组在内存中是如何存储的

    前言:本来想自己总结下,但发现以下文章已经写得很好,就直接放链接了. 英文文章:http://voidcanvas.com/javascript-array-evolution-performance ...

  7. Liunx之django项目部署

    一.python web 项目部署 python django默认启动python3 manage.py runserver 0.0.0.0:8000这种方式调用wsgiref单机模块,性能较低,生产 ...

  8. Apache Web服务器 安装步骤 和遇到的坑

    Apache Web服务器是开发放源码的网页服务器,我们看到的网页都是上传到服务器然后呈现给用户的. 在开发中,在自己的电脑上安装Apache Web服务器,你的电脑也会成为服务器,配置文件,访问你的 ...

  9. Fegin的使用总结

    /** * * @Description: 修改microservicecloud-api工程,根据已经有的DeptClientService接口 新建,MICROSERVICECLOUD-DEPT指 ...

  10. BOM相关方法及属性

    browser objec tmodel浏览器对象模型 BOM里面的方法大多在window对象底下,window代表窗口,也就是说,在BOM里面大多调用window下面的东西. 1.open方法是wi ...