【发布时间】:2021-06-26 15:56:21
【问题描述】:
我在 AR 环境中设置了一个由多个棋盘组成的游戏。
我需要在某个时候让一些棋盘闪烁。
我正在使用在场景的渲染器循环中执行的 SCNAction 来执行此操作,如下所述。
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)
{
if Blink { TargetNode.runAction(SCNAction.repeat(SCNAction.sequence([SCNAction.hide(), SCNAction.wait(duration: 1), SCNAction.unhide(), SCNAction.wait(duration: 1)]), count: 10)) }
}
TargetNode 是一个由数百个子节点组成的节点(棋盘之一,所有单元格作为单个节点,棋子也作为单个节点,TargetNode 的所有子节点)。 Blink 是在别处定义的标志。
几秒钟或几分钟后,我得到一个错误:
com.apple.scenekit.scnview-renderer (16): EXC_BAD_ACCESS (code=1, address=0x68)
在阅读了有关此问题的一些文献后,我开始明白必须在渲染器线程中进行节点修改,这里就是这种情况。至少它是从渲染器线程调用的。
我猜 SCNAction 的构建方式并不能真正确保它按预期执行。
有没有办法以不同的方式执行此操作或确保此 SCNAction 的执行(最好)?
谢谢
【问题讨论】:
-
你在 Xcode 中观察过你的内存图吗?如果它不断上升,则很可能您有可能导致崩溃的内存问题。你能提供更多代码吗?仅从您的 updateAtTime 示例很难判断。
-
内存图是的,它是稳定的。那里没有问题。确实是这个 SCNAction 触发了异常。
标签: ios scenekit arkit scnscene scnview