SKNode线程安全吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SKNode线程安全吗?相关的知识,希望对你有一定的参考价值。

在我用Swift制作的ios游戏中,我正在听触摸事件,阅读一些userDataSKNodeproperty,并更新其他一些SKSpriteNode的纹理属性,这是场景的一部分,但为了避免在用户交互过程中出现任何延迟,我在主队列上异步发送这个更新代码,这是个好主意吗?

顺便提一下,关于线程安全的一些一般性问题:只有在编写数据时是否存在风险,或者在读取数据时是否存在风险?

谢谢。

答案

正如目前的documentation on SKNode所说:

对节点的操作必须在主线程中进行。

那么,标题中问题的答案

SKNode线程安全吗?

没有。 SKNode不是线程安全的,它应该只从主线程修改。

但第二个问题的答案是:

我在主队列上异步发送这个更新代码,这是个好主意吗?

会是的。这正是你期望做的。

至于最后一个问题:阅读数据时可能存在风险。如果你读到像let version = 3这样的常量,就没有风险了。但是看看这个例子:

var bigLazyObject: BigObject?

func getBigLazyObject() -> BigObject {
    if let existingObject = bigLazyObject {
        return existingObject
    } else {
        let newObject = BigObject()
        bigLazyObject = newObject
        return newObject
    }
}

它演示了第二个BigObject实例的不必要的创建,如果同时在2个线程中调用getBigLazyObject(),则可能会发生这种情况。在else实际创建之前,两个线程都有可能落入if语句的bigLazyObject分支。创建线程安全的单例时应该解决这类问题。在Swift中,它们是线程安全的购买默认值,但在Objective-C中,人们通常使用dispatch_once()块。

以上是关于SKNode线程安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以将标签附加到 SKNode 吗?

为啥基于锁的程序不能组成正确的线程安全片段?

markdown 线程安全相关片段

这个代码线程安全吗

多个请求是多线程吗

这段代码安全吗,可以从构造函数 C++ 生成线程吗?