当从场景中移除SCNNode时,是否会调用特定的方法?
-(void)removeFromParentNode;
不会在SCNNode对象上被调用。
设置场景
我用重力拉下一个物体。当对象向下太远时,它会自动消失,绘制调用和多边形计数会减少。所以SCNNode绝对是被摧毁了,但是有什么方法我可以钩到毁灭吗?
发布于 2015-01-12 22:14:25
其他答案已经很好地说明了这一点,但更进一步说:
首先,您的节点没有从场景中移除--它的内容正传递到摄像机的观察结果之外,这意味着SceneKit知道它不需要向GPU发出绘制调用来呈现它。如果您对场景(或任何包含您正在讨论的节点的父节点)进行枚举子节点。,您将看到它们仍然存在。您损失了一些渲染性能成本,因为SceneKit不需要发出抽签请求,因为它知道在框架中看不到的东西。
(正如Tanguy的回答所指出的,这可能是因为您的zFar设置。也可能不是,这取决于节点从摄像机中掉进的方向。)
但是,如果您继续添加节点并让物理将它们从屏幕上删除,您将积累预渲染性能成本,因为SceneKit必须遍历每个帧的场景图,并确定需要发出抽签请求的节点。这个成本对于每个节点来说都是非常小的,但最终可能会导致一些您不想处理的事情。
既然你想在节点脱离帧的时候发生一些事情,你只需要找到一个很好的机会来处理这个问题,并清理正在消失的节点。
那在哪能做到呢?你有几个选择。如前所述,您可以在呈现循环中添加一些内容,以检查每个帧上每个节点的可见性:
- (void)renderer:(id<SCNSceneRenderer>)renderer didSimulatePhysicsAtTime:(NSTimeInterval)time {
if (![renderer isNodeInsideFrustum:myNode withPointOfView:renderer.pointOfView]) {
// it's gone, remove it from scene
}
}但是,这是一个有点昂贵的检查运行在每帧(记住,您的目标是30或60 fps在这里)。一个更好的方法可能是让物理系统帮助你:
SCNBox几何结构的节点,其大小足以“捕获”屏幕上掉下的所有内容。发布于 2015-01-12 15:34:07
如果你的对象比你的活动相机的ZFar属性更进一步,它就会消失。(默认值是100.0)正如大卫·伦奎斯特在评论中所说,你的节点没有被销毁,你仍然可以修改它的属性。
如果你想连接到你的节点的几何消失,你可以计算出你的活动相机和你的节点之间的距离,并检查它在你的渲染循环中的每一个帧,以触发一个动作,如果它超过100。
如果你想在更远的地方渲染你的节点,你可以修改你的相机的ZFar属性。
https://stackoverflow.com/questions/27891315
复制相似问题