簡體   English   中英

在手勢識別器動作方法中更改`SKNode`s是否安全?

[英]Is it safe to change `SKNode`s in a gesture recognizer action method?

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

修改受約束的回調之外的SpriteKit對象(后台隊列或任何其他非主線程)可能導致與並發相關的問題。 即使異步或稍后在主線程上調度工作也存在風險,因為關閉很可能是在SpriteKit期望的時間范圍之外完成的。 如果您遇到SpriteKit框架內部發生的分段錯誤或其他類型的崩潰,那么您的代碼很可能會在正常回調之外修改SpriteKit對象。

我正在使用手勢識別器與我的精靈工具包對象進行交互。 一個簡單的例子是當用戶點擊一個對象時向節點添加一個SKAction:

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

盡管這一點“暫時正常”,但我擔心這在更復雜的情況下不起作用。

蘋果有任何暗示這是允許的嗎? 或者我是否真的必須將SpritKit對象的修改從手勢動作推遲到規定的回調?

看起來你很安全,你只是分配一個動作。 這將在正常的精靈套件更新期間運行

如果你正在操縱實際的對象,或刪除一個節點,你會遇到問題。 假設你點擊刪除一個節點。 這個點擊發生在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上測試這個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM