首页 > Unity3D频道 > 【Unity3D研究院之游戏开发】 > Unity3D研究院之优化Graphics.DrawMeshInstanced(一百一十一)
2019
12-01

Unity3D研究院之优化Graphics.DrawMeshInstanced(一百一十一)

如果项目中使用GPU Instancing的话,很多人都会用底层API Graphics.DrawMeshInstanced在Update中绘制。

我们先来做个极端的测试,如下代码所示。

如下图所示,能看出来在Update每帧都有一个比较高的耗时。

Unity3D研究院之优化Graphics.DrawMeshInstanced(一百一十一) - 雨松MOMO程序研究院 - 1

如果每帧的调用Graphics.DrawMeshInstanced的位置矩阵和MaterialPropertyBlock参数都是一致,我就在想能否进行优化。

其实CommandBuffer也有DrawMeshInstanced方法,这样就可以不用在Update里每帧调用了。当位置矩阵或者MaterialPropertyBlock参数发生变化时在调用DrawMeshInstanced,放入CommandBuffer中渲染。

如下图所示,使用CommandBuffer.DrawMeshInstanced只有当元素位置改变时在刷新,这样明显效率高了很多。

Unity3D研究院之优化Graphics.DrawMeshInstanced(一百一十一) - 雨松MOMO程序研究院 - 2
结合实际项目,比如之前做过的地面的草、石头、栅栏一旦创建出来以后都不会去改变位置,更适合用commandbuffer来做。当然裁剪还需要自己来做,GPU instancing不支持自动裁剪。

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Unity3D研究院之优化Graphics.DrawMeshInstanced(一百一十一)》有 8 条评论

  1. 沈杰 说:

    想问下 CommandBuffer但是不支持设置layer

  2. ZzEeRO 说:

    极端测试那个是画了1024*1023个?画一次1023个的时候graphic和commandbuffer性能不会差很大吧

  3. douyi 说:

    你好雨松,想问下怎么跟Graphics.DrawMeshInstanced绘制出来的物体做交互,比如碰撞,改变颜色等,能否提供一个思路,谢啦!

    • 雨松MOMO 说:

      改变颜色很简单, 可以参考我之前的那篇 Graphics.DrawMeshInstanced lightmap的文章,
      碰撞可以搭配ECS JOB 过几天我会写这方面的文章。

  4. yfbz_bz 说:

    你好,有例子工程可以下载研究么?

  5. HuaHua 说:

    你好雨松,自己怎么做裁剪呢?

留下一个回复

你的email不会被公开。