Unity动态批处理和静态批处理学习
本文转自: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)
添加以下代码到空物体上。
此处请查看原文
void CombineMeshes(CombineInstance[] combine, bool mergeSubMeshes = true, bool useMatrices = true);
结合网格有利于性能最优化。如果mergeSubMeshes为true,所有的网格会被结合成一个单个子网格。否则每一个网格都将变成单个不同的子网格。如果所有的网格共享同一种材质,设定它为真。如果useMatrices为false,在CombineInstance结构中的变换矩阵将被忽略。
Unity动态批处理和静态批处理学习的更多相关文章
- unity静态批处理原理理解
今天主程给我好好讲了一下静态批处理的问题,记下来的笔记心得~ 1.静态批处理的时间点 1)在游戏导出的时候,在player setting中勾选static batching,这样在导出包的时候就进行 ...
- Unity3d Static 静态批处理和动态批处理
表示物体时静态的,多用于静止不动的物体,此外static有多种,有的用于烘焙,有的用于遮挡剔除 物理效果是rigidbody组件,和这个没关系,用transform.Translate 无法移动,因为 ...
- [Unity优化]批处理03:静态批处理
原理: 运行时,把需要进行静态批处理的网格合并到一个新的网格中.虽然只进行一次合并操作,但是会占用更多的内存来存储合并后的网格,并且被静态批处理的物体无法移动旋转缩放 要使用静态批处理,需要把Stat ...
- vert.x学习(六),动态模板与静态文件的结合
这篇学习在动态模板里面引入css,把动态模板与静态文件结合起来使用. 编写DynamicReference.java package com.javafm.vertx.helloworld; impo ...
- 自己在linux上编译、链接、动态库和静态库的学习笔记
在平常的项目中,我们都是使用公司要求的makefile.makedebug一类的文件,因此,在编译.链接.生成和链接动态库与静态库的时候,我们只是简单的使用一些已经设置的变量,只是简单的修改.添加一些 ...
- asp.net之动态页面和静态页面的区别
asp.net之动态页面和静态页面的区别 当我开始接触web开发的时候,首先学到的是html.css.js这一类网页语言,通过布局可以搭建出一个静态网站,效果也跟我们上网时经常看到的一些网站一样了.于 ...
- Deeplearning——动态图 vs. 静态图
动态图 vs. 静态图 在 fast.ai,我们在选择框架时优先考虑程序员编程的便捷性(能更方便地进行调试和更直观地设计),而不是框架所能带来的模型加速能力.这也正是我们选择 PyTorch 的理由, ...
- Android:JNI与NDK(二)交叉编译与动态库,静态库
欢迎关注公众号,第一时间获取最新文章: 本篇目录 一.前言 本篇主要以window开发环境为背景介绍一下NDK开发中需要掌握的交叉编译等基础知识,选window系统主要是照顾大多数读者,mac ,li ...
- Java动态代理与静态代理以及它能为我们做什么
相信我们在网上和平时学习和工作中或多或少都接触过Java的代理模式,经常听到什么静态代理.动态代理的一些名词.但我们是否真的很清楚这些呢?至少我在面试时,发现很多人并不很清楚. 首先代理比较好理解,就 ...
随机推荐
- swoole组件----mysql查询,插入数据
注意!任何swoole函数都应该包含在go(function(){}) 经典查询方法query() go(function (){ $swoole_mysql = new Swoole\Corouti ...
- BZOJ 3925: [Zjoi2015] 地震后的幻想乡(概率DP)
这里有一篇很好很强的博客%%% YouSiki大佬的博客 多理解一会就行了- 代码 #include <bits/stdc++.h> using namespace std; typede ...
- java第八次作业-继承
一.题目 编写一个应用程序,创建一个矩形类,类中具有长.宽两个成员变量和求周长的方法.再创建一个矩形类的子类------正方形类,类中定义求面积的方法.重写求周长的方法.在主类中,输入一个正方形边长, ...
- Django传递数据给JS
这里讲述两种方法: 一,页面加载完成后,在页面上操作,在页面上通过 ajax 方法得到新的数据(再向服务器发送一次请求)并显示在网页上,这种情况适用于页面不刷新的情况下,动态加载一些内容.比如用户输入 ...
- mysql 常见ALTER TABLE操作
删除列 alter table table-name drop col-name; 增加列(单列) alter table table-name add col-name col-type comme ...
- 022_STM32中断优先级分组解析
(0)STM32有十六个优先级 (一)STM32分组为:组0-4 (二)分组配置在寄存器SCB->AIRCR中: (三)解析第二点 1. 组0就是4位都用来设置成响应优先级,2^4=16位都是响 ...
- java web项目为什么我们要放弃jsp?(转)
前戏: 以前的项目大多数都是java程序猿又当爹又当妈,又搞前端(ajax/jquery/js/html/css等等),又搞后端(java/mysql/Oracle等等). 随着时代的发展,渐渐的许多 ...
- 路由器配置——基于链路的OSPF的MD5口令认证
一.实验目的:掌握基于链路的OSPFMD5口令认证 二.拓扑图: 三.具体步骤配置: (1)R1路由器的配置 Router>enable Router#configure terminal En ...
- 「CF716D」Complete The Graph「最短路」
题意 给定一个\(n\)个点\(m\)条边的无向图,有一些边权暂时为\(0\),你需要分配一个\([1, 10^{18}]\)的数.最终使得\(s\)到\(t\)最短路为\(L\),输出一个可行的分配 ...
- windows游戏编程X86 32位保护模式下的内存管理概述(二)
本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22448323 作者:jadeshu 邮箱: jades ...