今天主程给我好好讲了一下静态批处理的问题,记下来的笔记心得~

1、静态批处理的时间点

1)在游戏导出的时候,在player setting中勾选static batching,这样在导出包的时候就进行批处理,导出来的包就会比较大

   2 ) 在游戏场景中勾选场景物体的static选项,在加载该场景的时候,会进行一次静态批处理的合并,这样导出来的包不大,但是在加载的时候会使得内存变大。

2、静态批处理的基本原理

场景中有4个物体,ABCD,如果都勾选静态选项,在进行静态批处理的时候,引擎会判断这四个物体是否共用同一渲染材质。

  如果共用同一渲染材质,则会将这四个物体视为可以批处理的对象,引擎会基于单个渲染对象的大小拷贝出3个,总共变为4个mesh,此时这4个mesh会存在一个index buffer中,此时会让资源占用的内存变大4倍。

3、为什么要用静态批处理?

在游戏的运行中,有时候CPU的瓶颈也会至关重要。如果CPU的运行速度较慢,则GPU会出现等待CPU的情况,此时游戏主要受到CPU的限制。

   CPU在游戏中的主要分工,主要分为两个部分:设置渲染状态和调用DC。 其中设置渲染状态属于比较重要的分工,对于加载到游戏中的资源和对象等,CPU需要计算其顶点相关的矩阵,渲染所用的贴图,渲染所用到的材质和shader,渲染所用到的灯光等。

如果每个物体的材质和贴图等都不一样,此时CPU的主要工作就是设置这些物体的渲染状态(当然调用DC也会更多,但此时渲染状态的改变更消耗性能,也就是setPass),游戏的运行会比较缓慢。所以在常见的游戏中,对于大量的不需要改变位置的物体,都会采用静态批处理的方式来解决渲染状态的瓶颈。

  采用批处理的方式,对于相同渲染材质的物体,会合并成一个更大的渲染对象mesh来进行渲染,这时候设置合并后的渲染对象的渲染状态,与设置合并前的多个渲染对象的渲染状态相比会大大减小次数。

  此外对于大部分的渲染对象,主要的判断依据就是渲染状态和位置矩阵相关的参数。如果渲染状态一致,则基本可以视为同一个批处理的对象,然后对于位置矩阵进行单独的设置即可。其实在引擎的内部,对于需要渲染的对象也会进行一个渲染排序,会优先将渲染状态相同的排在一起进行设置,这样渲染状态的切换就不会过于频繁。

  通过批处理的方式来降低渲染状态的切换次数,可以极大的优化CPU的渲染瓶颈,所以在很多时候会采用静态批处理的方式来优化CPU的瓶颈。

4、对于静态批处理后的物体,如何决定其可视?

对于静态批处理后的物体,比如ABCD,那么如何在实际的游戏中去具体的渲染ABCD中的那几个可见(位于相机的视锥体内)? 这需要解释一下批处理的合并方式:在unity5中,会构建一个更大的内存buffer空间,依次存放ABCD的数据。

  在渲染A的时候,会调用DX的接口来取这份buffer中的指定起始点和长度的数据出来,传递到GPU中进行渲染。如果需要渲染AD两个对象,则会在前面的基础上,再将整体取出来(因为D存在末尾),然后传递到GPU中进行渲染。注意此时是整体传递A或者ABCD的数据,不会在CPU进行裁剪的工作。具体的A的哪部分可见,实在GPU的顶点裁剪过程中进行的。

  此时相当于要进行两次渲染,渲染的次数增大了,这样当然会带来一定的性能损耗,但是相对于渲染状态的设置改变带来的性能损耗,是可以接受的。游戏中如果大量的物体都采用静态批处理,此时会出现很大的内存buffer,如果渲染头和尾部的物体,则会使得渲染数据过大(CPU传递给GPU),带来较大性能损耗,所以可以在游戏中对静态批处理对象进行一个分块的处理。将场景中的对象分成多个块,每个块的大小可以依据一个经验值来设置,此时就会出现多个静态批处理的操作,而不是统一的一个静态批处理操作。具体的分块操作取决于具体的项目的场景大小,可以多次测试得到一个经验值来进行设置。

后面对于动态批处理的原理,待我学习请教后再补上~

unity静态批处理原理理解的更多相关文章

  1. Unity动态批处理和静态批处理学习

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

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

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

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

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

  4. java常量,变量,静态变量的理解

    最近考试出了一个很简单的题,看看他们对java常量,变量,静态变量的理解,代码如下: public class TestVar { /** * JAVA基础,常量,变量,静态变量 */ public ...

  5. JUC回顾之-ConcurrentHashMap源码解读及原理理解

    ConcurrentHashMap结构图如下: ConcurrentHashMap实现类图如下: segment的结构图如下: package concurrentMy.juc_collections ...

  6. unity 静态合批

    想做这样一个优化 因为cmd drawcall太多 materials太多导致 实际上只是贴图不一样 想用texture2DArray把他们合起来 texArray这步功能倒是很快就好了 但是从fra ...

  7. POJ1523(割点所确定的连用分量数目,tarjan算法原理理解)

    SPF Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7406   Accepted: 3363 Description C ...

  8. java的classLoader原理理解和分析

    java的classLoader原理理解和分析 学习了:http://blog.csdn.net/tangkund3218/article/details/50088249 ClassNotFound ...

  9. 六、smarty-缓存控制前的页面静态化原理

    页面静态化可以实现优化服务,对大流量访问网站非常至关重要 为什么页面静态化, 1.  不去执行数据库连接 2.  不去执行SQL语句 设置按时间更新, 1.  按时间更新,如果缓存文件设置1小时 如下 ...

随机推荐

  1. JsonCpp(C++程序使用)

    C++ json解析库 github C++: Makefile目录cmd:make 得到build 得到.a静态库 Eclipse引入头文件  (include目录) 引入.a静态库 编译设置: O ...

  2. 我的日志文件java logger

    操作读取日志文件, 1.使用默认的日志文件,并验证默认级别 public void originalConfig() { Logger logger = Logger.getLogger(Logger ...

  3. 让我的分页类获取sessionFactory

    我们知道在Hibernate里比较重要的sessionFactory,经过Spring的管理可以很好地为Spring里注入使用的bean服务(提供数据源的使用),但是,当我们所要使用的类不是像我们尝试 ...

  4. vue学习笔记 样式 class style(五)

    使用v-bind数据绑定class和style,v-bind:class可以与传统的class属性共存,其中可以用{}设置多个class,根据条件判断的语法是class名:条件,带-的class名需要 ...

  5. POPTEST老李谈Debug和Release的区别(c#)2

    二.哪些情况下 Release 版会出错 有了上面的介绍,我们再来逐个对照这些选项看看 Release 版错误是怎样产生的 1. Runtime Library: 2. 优化:这类错误主要有以下几种: ...

  6. html实现 页面禁止右键 禁止复制 禁止图片拖动 禁止复制和剪切

    众所周知,一般的屏蔽的方法是用JS来编写的脚本,但是也可以直接通过修改网页属性的方法来屏蔽右键 禁止复制. 禁止右键 oncontextmenu="return false" 禁止 ...

  7. 我的iOS-App

    1.PocketConfidential(密保箱) 简介 保存账号密码等敏感信息. 应用技术: sqlite.sqlcipher加密.AES数据加密.GCD https://itunes.apple. ...

  8. 给 Java 学习者的超全教程整理

    Java 在编程语言排行榜中一直位列前排,可知 Java 语言的受欢迎程度了. 网上有很多 Java 教程,无论是基础入门还是开发小项目的教程都比比皆是,可是系统的很少,对于Java 学习者来说找到系 ...

  9. Masonry适配的简单使用

    一.Masonry是什么: 答:是一个很好的三方,用来做适配的 二.怎么使用Masonry 1.先导入头文件 #define MAS_SHORTHAND #define MAS_SHORTHAND_G ...

  10. 实现简单的跨站脚本攻击(XSS)

    我们来通俗的了解一下什么是跨站脚本攻击(XSS):在表单中提交 一段 js代码 ,提交的内容被展示到页面时 ,js会被浏览器解析 打个比方吧,比如我现在写的这篇博客,写完以后我要发表对吧? 发表这个过 ...