首页 > Unity3D频道 > 【Unity3D研究院之游戏开发】 > Unity3D研究院GPU Instancing测试
2018
09-03

Unity3D研究院GPU Instancing测试

GPU instancing 很早就支持手机了(Android只支持Opengl ES 3.0),但是我一直不知道将它应用到哪里,刚好最近在调研这个我对它又重新测试了一下。

如果是不动的物体勾选static静态合并批次(40-50帧率)

Unity3D研究院GPU Instancing测试 - 雨松MOMO程序研究院 - 1

自定义Shader中勾选Enable GPU Instancing

Unity3D研究院GPU Instancing测试 - 雨松MOMO程序研究院 - 2

帧率竟然还不如静态合批次(帧率 30-40)

Unity3D研究院GPU Instancing测试 - 雨松MOMO程序研究院 - 3

自定义Shader

所以,静态不动的物体就没必要用上面的方法了,于是我又测试了Graphics.DrawMeshInstanced()方法,终于满意了。(稳定60帧)

Unity3D研究院GPU Instancing测试 - 雨松MOMO程序研究院 - 4

Graphics.DrawMeshInstanced()方法不需要游戏对象以及游戏组件的额外开销,在Update()方法中一气呵成,不过它也有限制,最多可以画1023个。
还有个方法是Graphics.DrawMeshInstancedIndirect()它没有画多少的限制,而且更加灵活,我也搞了好一会儿才在游戏中跑起来,后来才知道它不能再手机上用,只有PC上可以.

在shader中接收位置 颜色 矩阵

在代码中将位置 颜色 矩阵传进去就行了

如果是发生移动的物体顶点数量在900以内会动态合并批次,如果需要支持更多的顶点GPU Instaning的优势就更明显了。 目前来看草、石头、植被、比较合适用它。

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

Unity3D研究院GPU Instancing测试》有 7 条评论

  1. 汤圆 说:

    你好!请问Image上的材质可以使用GPUInstancing吗?试了下,好像不太行,有什么办法可以让Image也使用GPUInstancing吗?

    • 雨松MOMO 说:

      ugui的image是会根据canvas完整的合并mesh,如果想用GPUInstancing那得用spriterender将material block传进去

      • vega 说:

        你好,请问这个错误怎么处理,对shader不太了解
        ArgumentException: ComputeBuffer.SetData() : Accessing 64000 bytes at offset 0 for Compute Buffer of size 16000 bytes is not possible.

  2. 曹岩 说:

    Unity3D 用几何着色器制作的草可以使用Graphics.DrawMeshInstancedIndirect()吗?

  3. cll 说:

    StructuredBuffer的长度是不是不可以通过Length来取了? 我经过了尝试,shader会因此而报错

  4. M.C 说:

    Graphics.DrawMeshInstancedIndirect()可以再mobile上面用

留下一个回复

你的email不会被公开。