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

时间:2019-05-17 15:52:28

标签: 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)结果是:

  • 宇宙飞船旋转正常

  • 完成旋转打印成功

  • 现在挂了

  • 点击屏幕(或将设备旋转到横向),然后进行移动,然后将完成的移动打印出来。

我正在使用C#和Mac上的Visual Studio,但我怀疑它也是在Xcode中发生的。

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

也许这是此处所述的相同问题:

SCNAction completion handler awaits gesture to execute

2 个答案:

答案 0 :(得分:0)

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

尝试像这样将SCNView的{​​{1}}属性设置为true:

renderContinuously

答案 1 :(得分:0)

将SCNTransaction与completeBlock一起使用不会遇到相同的问题,因此可以正常工作:

        SCNTransaction.Begin();
        SCNTransaction.AnimationDuration = 3.0f;
        SCNTransaction.SetCompletionBlock(() =>
        {
            Console.WriteLine("DONE ROTATE");
            SCNTransaction.Begin();
            SCNTransaction.AnimationDuration = 3.0f;
            SCNTransaction.SetCompletionBlock(() =>
            {
                Console.WriteLine("DONE MOVEBY");
            });
            ship.Position = new SCNVector3(1.0f, 0.0f, 0.0f);
            SCNTransaction.Commit();
        });
        ship.EulerAngles = new SCNVector3(0.0f, (float)Math.PI / 2, 0.0f);
        SCNTransaction.Commit();

(也可以将CABasicAnimation与CAAnimationDelegate一起使用,以进行回调工作正常。)

由于SCNTransaction和CABasicAnimation有效,但RunAction无效,因此它看起来确实像RunAction中的Apple bug。