浅谈Batch(批次合并)

基础知识:

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,才能更合理的根据需求指定优化策略。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 减少批次大小(batch size)有以下几个优点: 1. 减少内存占用:较小的批次大小需要较少的内存,这对于具有受限内存的设备(如移动设备)来说非常重要。 2. 更高的泛化能力:较小的批次大小可以使模型更具泛化能力,因为它迫使模型在处理不同的输入时更加灵活。 3. 更稳定的训练过程:较小的批次大小可以减少每个批次中的噪声,从而使训练过程更加稳定。这可以减少梯度下降的方差,从而使模型更快地收敛。 但减少批次大小(batch size)也有一些缺点: 1. 训练时间更长:较小的批次大小需要更多的迭代次数才能收敛,因此训练时间更长。 2. 可能导致过拟合:较小的批次大小可能会导致过拟合,因为模型更容易记住较小的数据集。 因此,在选择批次大小时,需要根据具体情况进行考虑。一般来说,如果内存占用是主要问题,可以考虑减小批次大小;如果训练时间是主要问题,可以尝试增加批次大小;如果需要更好的泛化性能,可以尝试较小的批次大小。 ### 回答2: 减少批次大小(batch size)是指在机器学习训练过程中,每次送入神经网络的数据样本数量减少。在训练神经网络时,通常会将数据集划分为多个批次,每个批次包含若干样本,然后按批次逐渐输入神经网络进行训练。 减少批次大小可以带来以下几个好处: 1. 内存占用更小:较小的批次大小意味着每个批次的数据量减少,从而降低了训练过程中所需的内存占用。这对于大规模数据集或内存受限的设备来说非常有益。 2. 训练速度更快:较小的批次大小通常意味着每个批次的计算时间更短,因为相对较少的数据需进行计算。这将使得每个训练迭代的速度更快,从而可以更快地完成整个训练过程。 3. 模型泛化能力提升:较小的批次大小有助于增加数据样本之间的多样性,从而提高模型的泛化能力。通过每次输入不同的样本子集进行训练,可以更好地避免模型对特定批次中的特殊样本过度拟合,有助于增强模型的鲁棒性。 然而,减少批次大小也可能带来一些挑战: 1. 训练过程中的噪声:较小的批次大小可能会导致训练过程中的噪声增加。由于每个批次的数据样本变少,模型可能更容易受到来自噪声数据的干扰,从而对特定批次中的样本过度拟合。 2. 优化过程不稳定:较小的批次大小可能导致训练过程中的优化过程不稳定。较小的批次通常会导致梯度的估计结果存在较大的方差,从而使得模型参数的更新变得不稳定,可能需要更小的学习率或其他稳定优化方法来处理。 综上所述,减少批次大小在一定程度上可以提高训练速度和模型的泛化能力,但需要注意噪声和优化过程的稳定性。合理选择批次大小需要根据具体情况进行权衡和调整。 ### 回答3: 减少批次大小是指在机器学习算法中使用更小的样本批次进行训练。通常,批次大小是指在训练模型时一次输入模型的样本数量。减少批次大小可能会对模型的训练过程和性能产生一定的影响。 减少批次大小有以下几个优点: 1. 内存消耗较小:较小的批次大小意味着每次输入模型的样本数量减少,减少了所需的内存空间。这对于处理大型数据集或者拥有较小的计算资源的情况非常有帮助。 2. 更高的模型更新速度:减少批次大小可以加快模型的训练速度。当批次大小较大时,每次更新模型的时间较长,而较小的批次可以更频繁地进行模型的更新,从而加快了训练过程。 3. 提高模型的泛化能力:较小的批次大小可以增强模型的泛化能力。由于模型在每个批次的训练中学习到的是不同的样本特点,因此可以更好地捕捉样本数据集的多样性和复杂性,提高模型对未知数据的预测能力。 然而,减少批次大小也存在一些缺点: 1. 不稳定的模型训练:较小的批次大小可能导致模型训练时的损失函数波动较大,使得模型难以收敛,特别是在数据噪声较大或者数据集较小的情况下。 2. 训练时间增加:相对于较大的批次大小,较小的批次大小需要更多的迭代次数才能达到相同的训练效果,因此会增加训练时间。 综上所述,减少批次大小在某些情况下是有益的,但在选择批次大小时需要权衡数据集大小、计算资源、训练稳定性和训练时间等因素。适当调整批次大小可以改善模型的性能和泛化能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值