基本上,我想对SCNNode应用一些更改(例如,更改morpher.weights或更改骨架变换),然后渲染场景。
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%的图像是好的,并且包含具有正确骨骼位置和正确morpher权重的模型,而20%则不是(看起来像以前的值渲染的那样)。将更改应用到节点后,我需要一些完成处理程序。
我可以将渲染包装在DispathQueue.main.asyncAfter中,但我认为应该有一些好的解决方案。
如何正确处理?
可能是交易问题,但没有更多上下文很难说。
在applySomeChanges
中,您可以尝试使用显式交易
[SCNTransaction begin];
[SCNTransaction setAnimationDuration:0];
// changes to SceneKit objects
[SCNTransaction commit];
并且您也可以尝试在[SCNTransaction flush];
方法的开头调用render
。