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的代理模式,经常听到什么静态代理.动态代理的一些名词.但我们是否真的很清楚这些呢?至少我在面试时,发现很多人并不很清楚. 首先代理比较好理解,就 ...
随机推荐
- canvas制图学习
<!DOCTYPE html> <html lang="zh-en"> <head> <meta charset="UTF-8& ...
- node.js通过回调函数获取异步函数的返回结果
html文件代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Mybatis各种查询
实体Emp private int empno; private String ename; private String job; private Integer mgr; private Date ...
- CAZAC序列
定义: CAZAC(Const Amplitude Zero Auto-Corelation),即为恒包络零自相关序列. 性质: 1,恒包络特性:任意长度的CAZAC序列幅值恒定. 2,理想的周期自相 ...
- Oracle 物理结构(二) 文件-口令文件
一.口令文件作用 1.口令文件基本介绍 Oracle数据库口令文件存放有超级用户的口令及其他特殊用户的用户名/口令. 口令文件在数据库创建时,自动创建,存放在$ORACLE_HOME/dbs. 此文件 ...
- 启动文件startup_stm32f40_41xxx.s
一.启动文件,startup_stm32f40x_41xx.s 1.定义 启动文件由汇编编写,是系统上电复位后第一执行的程序. Stack_Size EQU 0x00000400 // 栈的大小可以调 ...
- 在Vue中使用TypeScript
TypeScript基础学习 初始化TS项目 Vue装饰器 vue-typescript-admin框架 1.TypeScript基础学习 2.初始化TS项目 3.Vue装饰器 Vue装饰器常用的有下 ...
- Codeforces 1221 E Game With String
题面 第一眼以为是SG函数找规律题,然后发现并不是公平游戏.... 不过后来想了想,其实这样反而更好做. 这个游戏的一个显然的特性是,任何时候当场上存在长度 ∈[b,a)的块时,Bob必胜.(考虑贪心 ...
- 【线性代数】6-4:对称矩阵(Symmetric Matrices)
title: [线性代数]6-4:对称矩阵(Symmetric Matrices) categories: Mathematic Linear Algebra keywords: Eigenvalue ...
- python 将IP地址转换成打包后的32位格式
python 2.7 #!/usr/bin/env python # Python Network Programming Cookbook -- Chapter - # This program r ...