最近做场景优化,看到我们场景里物体太多,那些树啊,房子,石头等等都使用了静态合批,但是场景里还有大量的草,包含顶点动画,没法做静态合批,动态合批条件又很苛刻。
在网上找到了gpu instancing方案,但网上的方案很多都没写明白,于是自己就记录一下使用方式以及使用时碰到的问题。
第一次测试按网上说的把材质的Enable GPU Instancing勾选

打开测试工程 加载一万颗草,帧率只有20多帧

感觉不太对啊,于是又查了很多资源,看到有别的资源说只勾选了没用,还需要在Update方法里面调用GPU渲染代码Graphics.DrawMeshInstanced(mesh, 0, grassT, testList[i])。
mesh是草的模型,grassT是草的材质,testList[i]是1000颗草的矩阵信息,API有规定,一定调用传入的矩阵数组最大只能是1023,所以我用了1000,然后for循环了10次,也就是一万颗草
运行工程再次测试

可以看到可以跑满60帧,提升还是很大的。
使用这个方法在场景是没有任何模型的,草的模型完全由GPU绘制出来。
到这里测试工程渲染问题就结束了,现在说说实际运用的第二个问题
在我使用这个技术到我们实际项目时在编辑器里是正常的,但打成PC包运行却一颗草都没有,打安卓包也没有草,没有任何报错。
我们的项目是打了AB包的,首先怀疑草模型或材质从AB包加载有问题,但日志输出模型加成功,材质加载也成功,并且使用AB包的模型和材质能在场景里实例化草来。
于是我把包含草模型和材质的AB包复制到测试工程下,开始找问题
第一次测试:使用AB包模型+AB包材质,编辑器下运行和打包后一样,没有草
第二次测试:使用AB包模型+本地材质,编辑器下运行可以看到一万颗草
第三次测试:使用本地模型+AB包材质,编辑器下运行和打包后一样,没有草
得出结论,问题出在材质上,可以前面使用AB包模型+AB包材质是能在场景里实例化出来草的,这里就很奇怪。
第四次测试:使用AB包模型,新建材质,然后把AB包材质的值赋值给新材质,然后传给GPU,这次在编辑器可以看到草了。
于是提交代码打包,但是打击又来了,包里还是没有草。
最后,把草的材质和贴图复制一份,放在Resources里,打包后,PC包和安卓包都出现草了。
浙公网安备 33010602011771号