前天帮公司做简单的Vuforia的脱卡遇到一个很奇葩的问题,一开始以为是我代码出问题,但是经过多轮的检查和验证发现代码并没有问题。
那么我遇到什么问题请允许我慢慢道来,Vuforia和Mataio都是整个行业的领军企业,Vuforia现在仍然是行业应用最多的AR SDK,为了最求性能和稳定性首选肯定是Vuforia。那么除去Vuforia的性能优化以外我们还要对自身代码结构、模型等进行优化。毕竟是一个在手机上跑的APP这样我们就要严格控制模型面数。
如图所示的面数是在没有光照前提下实际面数,那么开启实时光后就会出现一个很大的变化,模型面数就会激增到2.2M面,那么我们需要进行灯光烘培避免实时光带来的性能消耗,因此需要勾静态物体进行灯光的烘焙。在PC上运行的时候你会发现,所有的功能都是正常运作,脱卡、跳回原来的位置这些功能都是否正常的运行着,已发布到手机ipad就出问题。
那是什么问题呢?IPad和手机都出现了一部分模型脱卡,还有一部分停留在原来的地方?一开始我以为是我代码的问题,我在PC上反复的实验和验证,都没有出现移动端的问题,那么可以确定代码是没有问题的,那么开始纠结这个究竟是什么原因导致的呢?在机缘巧合下我在其他项目中尝试后发现,原来问题是出现在Unity性能优化上的问题。Unity3D在用户勾起静态物体的时候,就会自动进行帮程序进行静态批次的合并,简单来说就是程序员勾起静态物体之所以会性能得到一定的优化,主要取决于Unity对模型进行了网格合并,网格合并是对渲染批次优化的最好方式。然而在项目中模型的静态有一些重要信息是不变的,静态物体是接受一切三维功能的操作,因此脱卡后模型转移了父节点,同时对父节点进行操作,功能就失效了。
那么为什么会有一部分模型脱卡呢? 这个原因我暂时不清楚,毕竟没有Unity3D的源码。
那么如果我们想使用静态灯光,但是又不影响脱卡功能怎么办呢?
方法有两种:
第一种在勾起模型静态的时候,直接选择Lightmap Static即可这样就可以烘培出灯光,而且不影响到脱卡功能。
第二种方法:直接开启静态物体功能,然后在Player Setting里面把Static Batching的勾去掉即可,这样Unity就不会自动帮你合并网格。
这两种方式都可以避免出现我所说的,脱卡后模型依旧不动的问题。
(PS:顺便鄙视一下,一些所谓的程序猿,人家给不给红包是他自己做人的问题,你主动向别人先要红包,这是你做人的问题....不给就骂人或者是不教人,这种人有再厉害的技术也有限,这些人有损我们程序猿的形象)