【发布时间】:2019-10-04 23:42:51
【问题描述】:
从 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.sequence([SCNAction]) 函数,而不是在完成处理程序中运行新的 SCNAction。这可能会有所帮助,但我不确定
-
感谢您的想法,但我现在发现了问题的根本原因,即回调不在主线程上(!)。同样使用带有 Run 的 Sequence 来执行一个块也会在不同的线程上调用该块。所以一个解决方案是在主线程上调用回调,例如:SynchronizationContext Post...
标签: ios crash scenekit completionhandler scnaction