在Unity中重新为大型对象创建父对象最多需要8秒

时间:2019-06-02 08:28:40

标签: c# unity3d

在这种情况下,我需要将Oculus Hand的非常大的层次结构作为子级的根,这最多需要8秒,具体取决于该层次结构的大小。

这是示例代码:

//On new model import. 1108 is default hand hierarchy capacity
rightHand.hierarchyCapacity = 1108 + 2 * importedModel.transform.hierarchyCapacity;


private void Update()
{
   if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger))
      importedModel.transform.SetParent(Coordinator.instance.rightHand);    
   else if (OVRInput.GetUp(OVRInput.Button.PrimaryIndexTrigger))
      importedModel.transform.SetParent(null);
}

是否有优化的重新生成大型对象的方法?我在Unity论坛上看到了许多解决方案,但是这些解决方案都无法解决我的情况。

1 个答案:

答案 0 :(得分:2)

您可能无能为力,但是...

变换层次结构由Unity作为固定大小的数组存储在内存中,并且重新父级化导致Unity必须重新计算整个修改后的层次结构才能在内存中四处移动内容房间,然后插入新对象。如果我能找到的话,YouTube上有一个Unity谈话视频。这听起来似乎是Unity的一个糟糕计划,但这是不同优化的结果,该优化使Unity可以将整个层次结构处理为线性列表,并在C ++后端使用简单的偏移量。

您最好的选择是告诉Unity“嘿,这个对象,我希望在其层次结构数组中有额外的空间”,以适合您要移入其中的对象。这里的关键是您必须尽早这样做。在您重新整理内容之前执行此操作实际上并没有帮助,因为Unity仍会在该时刻执行此操作。

您可以通过将Transform.hierarchyCapacity的值设置为足够大的值来执行此操作。但是,我使用此属性的经验是,预测所需的大小是一项令人沮丧的练习。对于我要插入的相同数量的对象,我获得了与Unity不同的期望容量,而最终我不得不疯狂地高估了。