Ios 如何使用完成处理程序对SCNNode应用一些更改

Ios 如何使用完成处理程序对SCNNode应用一些更改,ios,scenekit,arkit,scnnode,Ios,Scenekit,Arkit,Scnnode,基本上,我想对SCNNode应用一些更改,例如更改变形器、权重或更改骨架变换和渲染场景 scnRenderer.scene = sceneView?.scene scnRenderer.pointOfView = sceneView?.pointOfView scnRenderer.sceneTime = 1 scnRenderer.render(atTime: 0, viewport: viewport, commandBuffer: commandBuffer, passDescriptor

基本上,我想对SCNNode应用一些更改,例如更改变形器、权重或更改骨架变换和渲染场景

scnRenderer.scene = sceneView?.scene
scnRenderer.pointOfView = sceneView?.pointOfView
scnRenderer.sceneTime = 1
scnRenderer.render(atTime: 0, viewport: viewport, commandBuffer: commandBuffer, passDescriptor:
                currentPassDescriptor)
commandBuffer.addCompletedHandler { (buffer) in
    animateNextStep?()
}
commandBuffer.commit()
我想为整个动画做这件事。伪代码如下所示:

func animateNextStep() { //will be called in render function after rendering
    guard step < count else { return }

    step += 1
    node.applySomeChanges()
    render()
}
目前,80%的图像质量良好,包含具有正确骨骼位置和正确变形器权重的模型,20%的图像看起来不像是使用以前的值渲染的。在将更改应用到节点后,我需要一些完成处理程序

我可以在DispathQueue.main.asyncAfter中包装渲染,但我认为应该有一些好的解决方案


如何正确操作?

可能是事务的一个问题,但如果没有更多的上下文,很难说

在applySomeChanges中,您可以尝试使用显式事务

[交易开始]; [SCNTransaction setAnimationDuration:0]; //对SceneKit对象的更改 [SCNTransaction提交];
您还可以尝试调用[SCNTransaction flush];在渲染方法的开始处。

谢谢!你的两个建议都很完美。请看我的另一个问题: