基础知识:

1.Drawcall:
        CPU调用一次GPU的绘制函数成为一次Drawcall。

2.在执行一次Drawcall过程中,CPU的性能主要消耗在哪里?主要有两点:
        CPU在调用绘制API后,会把指令转换成和设备无关的指令(这样就能做到在所有硬件设备上兼容了),这一转换产生开销,不过开销其实并不大。
        主要的消耗在于当进行渲染状态切换时,CPU会从用户模式切换到内核模式,这一转换非常消耗性能。
        所以,减少Drawcall次数,或者更精确点来说,减少Batch次数,就可以有效舒缓CPU的压力了~

3.什么时候需要进行渲染状态切换?
        当材质不一致又或者pass不同的时候,就需要进行切换了。

4.如何减少Batch次数呢?
        尽可能把相同材质的Batch合并成一个,一次性提交给GPU处理。

1.静态合批 Static Batching:
原理:在预处理阶段,把一些材质相同的模型的顶点统一变换到世界空间坐标下,并且新构建一个大的VB把数据保存下来,在绘制时,就会把这个大的VB提交上去,只需要设置一次渲染状态,再进行多次drawcall绘画出每个子模型。 所以Static Batching是不会减少drawcall的,但由于只修改了一次渲染状态依然可以减少CPU的消耗。而且在渲染前,也可以进行视锥体剔除,减少顶点着色器对不可见的顶点的处理次数,提交GPU的效率。

限制条件:
1.static顾名思义,不能修改他的transform属性(位置,旋转等)。
2.材质必须相同。
3.不能有超级大量的相同模型(如:森林里的树)

优点:无需额外使用CPU的算力,一次渲染命令就可以同时渲染出多个独立模型。
缺点:因为需要额外维护多一份数据,所以包体会变大,占用的内存也会变多(所以才会有上面说的限制条件3)

其实总的来说,Static Batching其实就是计算机里最经典的空间换时间,以此来提升渲染效率。

2.动态合批 Dynamic Batching:
原理:在每一帧运行时,计算相同材质的模型,把他合并批次进行渲染。动态合批只需要设置一次渲染状态,且能减少drawcall次数。

限制条件:
1.材质相同
2.顶点数不能过多

优点:动态顾名思义,可以修改transform的属性,而且因为实时计算结果,所以也不需要占用运行时内存和增大包体大小

缺点:每帧都要进行合批,每帧都得运算,CPU开销较大。

静态合批VS动态合批:
        
其实静态合批和动态合批实现的大致原理是差不多的,主要是进行合批的时间点不同,一个是在编译时处理,一个是在运行时处理。 但正因为处理时间点不同,最终也产生了具体的差别:
1.静态合批在编译时处理后需要占用储存空间把数据存储下来,而且运行时加载这些数据也会占用运行内存。
2.动态合批则每帧都需要进行大量计算来进行批次合并。但以为是实时计算出结果,所以也不会出现像静态合批那样,限制Object不允许修改transform的属性。
3.静态合批和动态合批都是在CPU端进行优化处理的。

3.实例化渲染GPU Instancing:
        当有大量的Object,他们具有相同的Mesh和相同的Material时(例如花花草草,森林里的树木等),就可以使用GPU instancing了。因为对每个Object都会产生一个新的实例,所以可以对具体不同的实例设置不同的参数(如 color,scale)等。

4.SRP Batcher:
        前三种处理方式的出发点基本都是为了减少Batch的次数,而SPR Batcher出发点却完全不同,SPR Batcher并不会减少Batch的次数,而是减少每个Batch所需要处理的工作。其工作原理就是在GPU中设置缓冲区,用于记录存储材质相关的数据,这样就可以减少CPU发送给GPU的数据量,减少Batch的工作量了。 当场景有大量的材质而仅有少量的shader时,使用这种方式可以大幅提升效率。

在文章的最后讲一个故事:
        在一个星球上,有两块大陆,一块叫CPU,一块叫GPU,两块大陆通过一个桥梁连接着,桥梁每分钟同行一次。
        假设CPU每分钟放行一辆车过桥,那么1小时车流量才60台.(估计此时CPU上大塞车都等着过桥了吧……)
        那么假设CPU每分钟放行两台车过桥,1小时车流量就能达到120台;放行10台车,车流量就能达到600台。效率大大提升。
        这时,CPU就在想,为了我这大陆上不堵车,我不限流了,把车子大量放行过桥,可这时,GPU处理不过来了……GPU开始堵车了,CPU的车子也过不去了……

这个故事告诉我们,当CPU忙不过来的时候,进行批次合拼,确实是可以提高效率减少性能瓶颈,可也不是说drawcall就一定是越小越好,如果当前性能瓶颈在GPU,那么即使减少了drawcall也不见得性能就有所提升。就好像假设我们在PC上玩游戏,PC的CPU运算速度足够快,减少drawcall也不会让游戏更流畅。现在的手机CPU芯片也越来越强大了,图形处理的技术也越来越成熟了(对性能的消耗降低了很多)。 对drawcall进行优化之前最好了解清楚你的游戏运行的平台,具体运行压力在CPU还是GPU,才能更合理的根据需求指定优化策略。

浅谈Batch(批次合并)相关推荐

  1. 浅谈GCC预编译头技术

    浅谈GCC预编译头技术 文/jorge --谨以此文,悼念我等待MinGW编译时逝去的那些时间. 其 实刚开始编程的时候,我是丝毫不重视编译速度之类的问题的,原因很简单,因为那时我用BASICA.后来 ...

  2. java程序的装载与检查_浅谈Java类型装载、连接与初始化

    类型装载.连接与初始化 Java虚拟机通过装载.连接和初始化一个Java类型,使该类型可以被正在运行的Java程序所使用.其中装载就是把二进制形式的Java class文件读入Java虚拟机中去;连接 ...

  3. iOS实录15:浅谈iOS Crash

    导语:在当前的iOS开发中,虽然ARC为开发者解决了手动内存管理时代 的许多麻烦,但是内存方面的问题依然是产生iOS Crash的元凶之一,本文介绍内存方面,有关僵尸对象.野指针.内存泄漏.废弃内存这 ...

  4. 浅谈算法和数据结构: 五 优先级队列与堆排序

    原文:浅谈算法和数据结构: 五 优先级队列与堆排序 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏 ...

  5. 五分钟DBA:浅谈伪分布式数据库架构

    [IT168 技术]12月25日消息,2010互联网行业技术研讨峰会今日在上海华东理工大学召开.本次峰会以"互联网行业应用最佳实践"为主题,定位于互联网架构设计.应用开发.应用运维 ...

  6. python数学库的使用方法_浅谈numpy库的常用基本操作方法

    NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推.在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量.比如说,二维数组相当于是一个一维数 ...

  7. mysql 提高电脑配置_Mysql配置优化浅谈

    Mysql配置优化浅谈安装MySQL后,配置文件my.cnf在MySQL 安装目录/share/mysql目录中,该目录中还包含多个配置文件可供参考,有my-large.cnf ,my-huge.cn ...

  8. oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念 Nested loop join: Outer - phpStudy...

    浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...

  9. 浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别

    浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别 标签: caffe深度学习CaffeNet 2016-11-02 16:10 1203人阅读 评论(1) ...

最新文章

  1. 跨平台PHP调试器设计及使用方法——立项
  2. 按作用域分的话 php的变量可分为,mysql全局变量表
  3. Angular中ngModel的$render的详解
  4. 算法-排序-冒泡排序
  5. er图 navicat_navicat怎么生成er图
  6. echarts 水桶注水式柱状图
  7. 手把手教你实现机器学习SVM算法
  8. 车联网技术与产业发展趋势 学习记录
  9. LightOJ1336
  10. 免Root–获取WIFI密码
  11. echarts html ppt,PPT美化之echarts
  12. 基于matlab的BCH编译码算法原理介绍与仿真分析
  13. SO SOIC TSOP TSSOP 封装
  14. Acrobat Reader XI启动后自动关闭的分析
  15. 优秀课程案例|如何用scratch画折线统计图
  16. 设置数字和字符串的格式(已更新)
  17. Matlab 去趋势处理
  18. 【优化覆盖】基于matlab粒子群算法优化无人机编队布局求解车载网络通信覆盖优化问题【含Matlab源码 2021期】
  19. 始终重写 toString 方法
  20. MySQL 8 复制(十)——组复制性能与限制

热门文章

  1. GSMS-华为应急通讯完美版 ISO文件下载
  2. centos7内核3.10.0-1160.el7.x86_64升级5.4.93-1.el7.elrepo.x86_64
  3. 图解java反射机制及常用应用场景
  4. 那种计算机能玩游戏,我的电脑能玩什么游戏?
  5. 超融合集群数据分布原理
  6. 心理测评系统与心理咨询预约管理系统
  7. 物通博联工业网关串口接法|端子口接线方式
  8. ZOJ 1104 Leaps Tall Buildings
  9. 面对金九银十你真的准备好了吗?
  10. 黑莓9900能否读取二代身份证啊? (求证中)