最近在做系统的gameobject池管理,所以需要研究一下物体不可见,和设置parent的最优搭配
物体不可见方案
1:可移动物体位置到摄像机可照射范围之外;2:设置物体大小到0;3:禁用component组件;4:禁用gameobject;5:设置layer层级为摄像机不可见层级
测试下来发现禁用layer为最优化的方案。
此测试为3D摄像机的测试数据,只测试了cpu计算耗时,此耗时为unity内部实现方法的耗时,即函数耗时。
缩小scale在3D摄像机里是不会减少DC的但是在2D下,是可以减少DC的。猜测的区别为:在2D摄像机下,会重组mesh,当scale为0的时候会被剔除出mesh渲染中,这个为2D的实现方法,后续整理这块数据。在3D摄像机下的时候,不管scale是否为0,这个物体的矩阵还是存在的,所以还是要进行矩阵转换和渲染。
在2D下移走坐标是不会减少DC的,但是加一个2Dmask就可以。猜测为:UI和2Dmask的矩阵求交集,超出就不渲染。
后续补充:
在设置layer的时候,你如果设置物体父节点的layer但是子节点是不管用的,所以你只能循环子节点来设置,在这个时候产生了循环遍历,消耗就变成指数级别的上升。最优选择为设置大小。还产生了GC。
设置parent方案
设置parent为null,和设置parent为具体的gameobject;Setparent第二个参数worldPositionStays为true和false,当这个值设置成false的时候是不会修改localposition的坐标,这个就相当于,直接把物体的世界坐标给修改了。
测试结果为设置parent不能为null,为null是最耗时的, worldPositionStays可设置为false,这样最优的,设置成true的时候设置parent的耗时和设置parent的层级有关系,如果层级最深的话耗时最长
方案选择
根据以上的测试结果,方案为设置物体的parent为最浅根节点worldPositionStays设置为false,以设置layer的显示层级来决定是否渲染。
拓展发散
当需要隐藏一个物体不被摄像机渲染的时候,我们可以选择设置layer。还有一个测试数据为当获取物体的localposition的时候比获取物体的position要快将近一倍。所以unity保存物体的坐标系是否为localpostion和一个世界坐标的转换矩阵,然后position为使用的时候才去计算。还有设置parent为null的时候慢了超过1/9,设置为null的时候是否重新生成了一份场景物体树的根节点。这些都需要以后好好研究一下。最后一句,不考虑数量级的优化都是假的。