gpt4 book ai didi

ios - 在手势识别器操作方法中更改 `SKNode` 是否安全?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:15:53 25 4
gpt4 key购买 nike

Apple 在 https://developer.apple.com/documentation/spritekit/skscenedelegate 中声明:

Modifying SpriteKit objects outside of the ordained callbacks (a background queue or anything else non-main-thread) can result in concurrency related problems. Even dispatching work on the main thread asynchronously or at a later time is risky because the closure is likely to be done outside of the timeframe SpriteKit expects. If you're experiencing a segmentation fault or other type of crash occurring deep within the SpriteKit framework, there's a good chance your code is modifying a SpriteKit object outside of the normal callbacks.

我正在使用手势识别器与我的 sprite 工具包对象进行交互。一个简单的示例是在用户点击对象时向节点添加 SKAction:

func tapAction(gr:UITapGestureRecognizer) {
scene.childNode(withName: "balloon")!.run(SKAction.fadeOut(withDuration: 2))
}

尽管目前这“刚刚好”,但恐怕在更复杂的情况下这不起作用。

Apple 是否暗示这是允许的?或者我真的必须将 SpritKit 对象的修改从手势操作推迟到指定的回调吗?

最佳答案

看起来你很安全,你只是在分配一个 Action 。这将在正常的 sprite 工具包更新期间运行

如果您要操纵实际对象或删除节点,就会遇到问题。假设您点击以删除一个节点。此点击发生在 didContactBegin 之前。 didContactBegin 会期望有一个节点,但是,唉,你删除了它,所以它会崩溃。

如果您想对此感到安全,请设置一个队列以在更新开始时触发。

class GameScene : SKScene
{
public typealias Closure = ()->()
public var processOnUpdate = [Closure]()


override func update(_ currentTime: TimeInterval) {
proceseOnUpdate.forEach{$0()}
processOnUpdate = [Closure]()
....//do other stuff
}
}

//SKView Code
func tapAction(gr:UITapGestureRecognizer) {
scene.processOnUpdate.append(
{
scene.childNode(withName: "balloon")!.run(SKAction.fadeOut(withDuration: 2))
}}

}

如果这不是第一次运行,我很抱歉,我现在不在 Mac 上测试它。

关于ios - 在手势识别器操作方法中更改 `SKNode` 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45080578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com