BIM模型不经过处理,直接加载到Three.js 创建的场景中,很大可能会很使fps帧率下降,原因在于模型的个数太多,有的模型是多材质的话还需要在Three.js中绘制两次,这样会导致drawcall过载,虽然在开启视椎体剪裁的情况下,Three.js中已经进行了模型剔除的处理,但仍然很难解决drawcall过载的问题,可以F12 打开devtool看下cpu使用率。
如何解决这种情况呢,可以先看一下gpu渲染的流程(涉及到硬件),参考这篇文章:
https://zhuanlan.zhihu.com/p/58694744
对整个gpu的结构有了之后,那可以明确要做的优化,每一次drawcall尽可能多的顶点数量,充分利用GPU的渲染计算能力。还有一点就是多实例渲染,简而言之,就是各种顶点数据在一次drawcall提交之后,可以在GPU进行复用进行渲染,uniform可以像attribute一样传递(这样说也不是很准确,准确地说是每个实例可以具有不用的uniform变量)。
这两种方式都具有很好渲染速率优化的作用,那具体怎么用,主要是结合项目的情况,一般是两者一起用,那是先应用多实例渲染还是先应用顶点合并呢,主要是也是看项目的实际情况,比如对内存的要求,如果没有要求,两者的使用顺序使drawcall最少的情况,就是最佳的使用顺序,我对整个项目做完优化过后,drawcall相比之前降低70%左右。