我有一个 CALayers 层次结构,我将其设置为我的 SCNNode 材质的漫反射属性。我使用以下代码对场景的当前状态(只有一个节点)进行快照,以将其作为 PNG 保存到文件中:
scene.rootNode.addChildNode(node)
node.geometry?.firstMaterial?.diffuse.contents = self.createLayer() // CALayer
// Set transform of node.
let renderTime = CACurrentMediaTime() + 1
let size = CGSize(width: 600, height: 600)
let renderer = SCNRenderer(
device: MTLCreateSystemDefaultDevice(),
options: nil)
let image = self.renderer.snapshot(
atTime: renderTime,
with: size,
antialiasingMode: .multisampling4X)
return image
通常这可以正常工作,按预期渲染节点,但大约 25-50% 的时间,我作为返回层的子层的任何 CATextLayer 都self.createLayer()
不会渲染文本。所有其他图层似乎每次都渲染得很好。
例如,应该看起来像这样的图像:
图层本身正在渲染,我可以通过更改文本图层的背景颜色来确认:
这似乎只是在创建图层后立即发生的问题。如果我异步调度渲染代码,即使没有添加任何延迟,一切都会按预期呈现:
scene.rootNode.addChildNode(node)
node.geometry?.firstMaterial?.diffuse.contents = self.createLayer() // CALayer
// Set transform of node.
let renderTime = CACurrentMediaTime() + 1
let size = CGSize(width: 600, height: 600)
DispatchQueue.main.async {
let image = self.renderer.snapshot(
atTime: renderTime,
with: size,
antialiasingMode: .multisampling4X)
completion(image)
}
上述解决方法似乎很老套,我不相信它是可靠的。另外,我宁愿不强制我的调用点以异步方式调用该方法。
SceneKit 或 CoreAnimation 中是否有我缺少的属性或方法可以用来确保在尝试将其渲染到图像之前完全渲染图层?