ios - 在 SceneKit 中,当从 RunAction 的完成处理程序调用时,SCNAction 挂起

标签 ios crash scenekit completionhandler scnaction

从 RunAction 的完成处理程序调用 SCNAction 似乎挂起 SceneKit。

触摸事件或旋转设备似乎可以解除挂起。

重现:

1) 使用旋转宇宙飞船启动时获得的默认 SceneKit 项目。

2)替换动画代码:

ship.RunAction(SCNAction.RepeatActionForever(SCNAction.RotateBy(0, 2, 0, 1)));

与:

        ship.RunAction(SCNAction.RotateBy(0, 2, 0, durationInSeconds: 3.0f), delegate
        {
            Console.WriteLine("DONE ROTATE");
            ship.RunAction(SCNAction.MoveBy(1, 0, 0, durationInSeconds: 3.0f), delegate
            {
                Console.WriteLine("DONE MOVEBY");
            });
        });

3)在模拟器或真机上运行(两者问题相同)

4)结果是:

  • 飞船旋转正常

  • DONE ROTATE 打印出来 OK

  • 现在已挂起

  • 点击屏幕(或将设备旋转至横屏),然后移动成功并打印出 DONE MOVEBY。

我正在使用 C# 和 Visual Studio for Mac,但我怀疑它也发生在使用 Xcode 时。

这是 SceneKit 中的错误吗?如何解决?

也许这与此处描述的问题相同:

SCNAction completion handler awaits gesture to execute

最佳答案

发生这种情况是因为默认情况下 SceneKit 不会连续渲染。当点击屏幕时,场景会发生变化,并且会渲染一个新的帧。这就是 moveBy 操作不会在 rotateBy 操作之后立即触发的原因。

尝试将 SCNViewrenderContinuously 属性设置为 true,如下所示:

scnView.rendersContinuously = true
ship.runAction(SCNAction.rotateBy(x: 0, y: 2, z: 0, duration: 3.0)) {
    print("DONE ROTATE")
    ship.runAction(SCNAction.moveBy(x: 1, y: 0, z: 0, duration: 3.0), completionHandler: {
        print("DONE MOVEBY")
        scnView.rendersContinuously = false
    })
}

关于ios - 在 SceneKit 中,当从 RunAction 的完成处理程序调用时,SCNAction 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56189836/

相关文章:

ios - SceneKit 几何图形看起来像是一场小故障灾难

iphone - 如何从 NSUserDefaults 存储检索 float

ios - 将 Amazon API Gateway 与 ios 结合使用

java - 尝试将值插入 sqlite 数据库表时应用程序崩溃

ios - 如何在 iOS 中使用 dSYM 文件解码崩溃日志?

ios - Apple 反馈该应用程序在启动时崩溃

ios - 使用基于图像的光照在 3D 模型上应用 PBR 纹理

ios - 在 iOS 中,为什么 SceneKit 景深比 SpriteKit 快?

iphone - 如何使用搜索栏实现基于单个字母的搜索?

iphone - iOS - UIScrollView 不更新其内容,一些 UIViews 在重新加载后消失