SRBatch和GPUInstance的渲染比较
2021-01-22 本文已影响0人
暴走TA
简介: 对SRBatch的性能和GPUInstance的性能想做个比较于是做了如下渲染分析,可能有环境因素分析错了,目前临时做个笔记
测试环境:Unity2019.4.18
测试手机:黑鲨3 865的U
环境
在满屏幕绘制使用13个材质铺满全屏的物体,尽量错开摆放,使其全部都能参与渲染。
着色器 一个支持instance 一个支持 srbatch 其余逻辑一致
测试结果
FrameDebug 对比分析
参数名称 | SRBatch | Gpuinstancing |
---|---|---|
渲染时间 | 14-22 ms | 18-21 ms |
渲染消耗最高值 | 24 ms | 25 ms |
脚本占用时间 | 10-11 ms | 8-11 ms |
脚本占用峰值 | 16 ms | 15 ms |
DrawCall | 36 | 265 |
可以看出 frameDebug 中的dc 数量有明显的减少,由于手机性能太好,所以 渲染时间差距不大
RenderDoc 对比分析
SRBatch 渲染时间SRBathc 统计数据
SRBatch 合批绘制方式
Instance渲染时间
Instance统计数据
Instance合批渲染方式
参数名称 | SRBatch | Gpuinstancing |
---|---|---|
单帧耗时 | 113136 us | 42215 us |
RenderOpaques | 105407 us | 35116 us |
DrawCalls | 2973 | 370 |
APICalls | 4003 | 3903 |
DrawCallRatio | 1.35 | 10.55 |
Buffers 数量 | 163个 | 1056 |
Buffer 内存占用 | 3.19MB | 11.07MB |
- 可以看出 SRBatch 的单帧渲染时间将近是 Instance的渲染时间的 三倍,其中最大的区别就是,在FrameDebug中 SrBatch 的 DC 统计数量是36,而在 RenderDoc中这个数量是 2973。而这其中的猫腻,就在与 Instance方式调用的绘制方式 有一部分是glDrawElementsInstanced(),而 SRBatch 则是实打实的每一个都调用了 glDrawElements();
- 在 RenderDoc 中 SRBatch 占用的 buffer数量和内存都有了大幅度的减少,但是绘制次数 确实每一个物体都会绘制,虽然每一个绘制都比较短,但是数量太大。
结论
目前看来数量太多的时候 srbatch 并不一定可以提升效率,至于为何 在合批绘制时没有使用 glDrawElementsInstanced 要待验证。