unity静态批处理原理理解

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

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),带来较大性能损耗,所以可以在游戏中对静态批处理对象进行一个分块的处理。将场景中的对象分成多个块,每个块的大小可以依据一个经验值来设置,此时就会出现多个静态批处理的操作,而不是统一的一个静态批处理操作。具体的分块操作取决于具体的项目的场景大小,可以多次测试得到一个经验值来进行设置。

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

时间: 2024-10-13 09:05:57

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

静态路由原理与配置——理论篇

静态路由原理与配置--理论篇 目标:理解路由的原理学会配置静态路由和默认路由学习内容:①路由原理②路由器的工作原理③路由表的形成④静态路由和默认路由⑤路由器转发数据包的封装过程 一.路由原理路由器工作在OSI参考模型的网络层,他的额重要作用是为数据宝选择最佳路径,最终送达目的地.在只有一个网段的网络中,数据包可以很容易地从源主机到达目标主机.但是如果一台计算机要和非本网段的计算机进行通信,数据包可能就要经过很多路由器.如图所示,主机 A 和主机 B 所在的网段被许多路由器隔开,这时主机 A 与主

POJ1523(求连用分量数目,tarjan算法原理理解)

SPF Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7406   Accepted: 3363 Description Consider the two networks shown below. Assuming that data moves around these networks only between directly connected nodes on a peer-to-peer basis, a

JAVA 1.7并发之LinkedTransferQueue原理理解

昨天刚看完BlockingQueue觉得好高级啊,今天扫到1.7就发现了升级版.... 如果对内容觉得不够充分,可以去看http://www.cs.rochester.edu/u/scott/papers/2009_Scherer_CACM_SSQ.pdf 就是作者的论文啦,纯英文...比较难啃,但是我觉得逻辑上比看代码容易理解,其实代码什么u啊h啊看得很混 LinkedTransferQueue 起源: 我觉得是这样的,之前的BlockingQueue是对 读取 或者 写入 锁定整个队列,所以

Java内存的原型及工作原理理解

一.java虚拟机内存原型 寄存器:我们在程序中无法控制. 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 堆:存放用new产生的数据 静态域:存放在对象中用static定义的静态成员 常量池:存放常量 非RAM存储:硬盘等永久存储空间. 二.常量池(constant pool) 常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据.除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如String及数组)的常量值(final)

ConcurrentHashMap源码解读及原理理解

ConcurrentHashMap结构图如下: ConcurrentHashMap实现类图如下: segment的结构图如下: package concurrentMy.juc_collections.hashMap; import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; import java.util.AbstractCollection; import java.

iptables_原理理解_DNAT&SNAT实践应用

我们都知道iptables 是防火墙,但是实际上 iptables只是配置防火墙的一种工具,真正在工作的是neifilter,netfilter存在于kernel,也就是说是kernel在处理进去出来的数据包: 直接看图,看看kernel是如何处理这些数据包的,并且能干什么: 2. 先说收DNATDNAT目标地址转换在PREROUTING链上做:可以将虚拟机的服务映射到宿主机的ip上,达到访问宿主的 ip就等于访问虚拟机的效果; iptables -t nat -A PREROUTING -d 

https 原理理解

一.什么是HTTPS在说HTTPS之前先说说什么是HTTP,HTTP就是我们平时浏览网页时候使用的一种 协议.HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全.为了保证这些隐私数据能加密传输,于是网景公司 设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS.SSL目前的版本是3.0,被IETF(Internet Engineering Task Force)定义在RFC 6101中,

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

页面静态化可以实现优化服务,对大流量访问网站非常至关重要 为什么页面静态化, 1.  不去执行数据库连接 2.  不去执行SQL语句 设置按时间更新, 1.  按时间更新,如果缓存文件设置1小时 如下为页面静态化原理实例: //内容分页显示实例 <?php $cachefile = "demo_".$get["page"].".html"; //定义的缓存文件用于存放静态页面, $get["page"]表示将每一分页都缓

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

表示物体时静态的,多用于静止不动的物体,此外static有多种,有的用于烘焙,有的用于遮挡剔除 物理效果是rigidbody组件,和这个没关系,用transform.Translate 无法移动,因为已经把他当做静止物体了 为了更好地使用静态批处理,你需要明确指出哪些物体是静止的,并且在游戏中永远不会移动.旋转和缩放.想完成这一步,你只需要在检测器(Inspector)中将Static复选框打勾即可,如下图所示: 动态批处理 就相同材质 相同的缩放值. Don't use scale. Obje