在做一些项目的时候,可能美术模型不标准,加上只关心好看,不关心性能。因此到最后整个场景运行费劲。以下是我在做webgl工程时,积累的一些优化经验,尽量不影响效果。

一、模型检查

首先检查美术的模型,这里检查模型,不是检查顶点三角数量,因为这可能影响效果。主要检查贴图,材质。美术在搭建场景的时候,都习惯用standard shader。然后一些模型只是因为颜色不一样,就用了两个材质球,模型贴图完全没有合并。有的模型还有submesh,但是submesh材质球只是贴图不一样。

解决方法:

我自己写了一个合并材质球的插件。如果两个模型,只有贴图不一样(纹理,法线,自发光),可以将材质合并,自动生成合并贴图,然后生成修改uv后的模型。原理是将材质的贴图合并(叠加颜色属性或者生成一个单色图片),然后根据合并后图片的uv,修改模型的uv。这种方法可以把大多数模型,通用一个材质球。

二、shader检查

对于不重要的物体,可以不要使用standard Shdaer,可以自己写一个有基础属性的shader。

 

三、物体静态

模型Mesh合并渲染可以节省drawcall,因此在使用第一步的步骤后,将材质一致的模型通过StaticBatchingUtility.Combine合并模型。合并的模型顶点数好像有一个上限40000左右。

四、GPU Instance

将材质球勾选上GPU Instance, 主要针对非静态的物体。然后只要材质球一致,就会减少drawCall。

自己写的Shader 要自己写GpuInstance 的实现。

五、DrawMeshInstanced

针对很多重复的相同物体,可以使用DrawMeshInstanced,这个和GPU Instance原理一样。

六、灯光烘焙

如果场景灯光是固定的,物体有部分是static的,可以选择烘焙lightmap。如果有昼夜系统,白天灯光有变化,夜晚灯光主要点光源,其实也可以烘焙一下夜晚的灯光。自己在shader中切换,物体是否使用lightmap。也可以为物体烘焙好几套lightmap,然后动态替换。