是否经常使用计算属性影响性能来访问对象?

时间:2016-02-01 15:35:54

标签: ios swift properties

我正在使用GameplayKit和amp; SpriteKit框架。在关于GameplayKit的Apples示例中,您经常会看到以下内容:

class PlayerEntity: GKEntity {
    // MARK: Components

    var renderComponent: RPRenderComponent {
        guard let renderComponent = componentForClass(RPRenderComponent.self) else {
            fatalError()
        }
        return renderComponent
    }
    var stateMachineComponent: RPStateMachineComponent {
        guard let stateMachineComponent = componentForClass(RPStateMachineComponent.self) else {
            fatalError()
        }
        return stateMachineComponent
    }
    // MARK: Initialisation
    override init() {
        super.init()

        let renderComponent = RPRenderComponent()
        renderComponent.node.entity = self;
        let stateMachineComponent = RPStateMachineComponent(states: [
            RPPlayerStandingState(entity: self),
            RPPlayerFallingState(entity: self),
            RPPlayerBouncingDownState(entity: self),
            RPPlayerBouncingUpState(entity: self),
            RPPlayerJumpingState(entity: self),
            RPPlayerBoostState(entity: self)
            ])
        addComponent(renderComponent)
        addComponent(stateMachineComponent)
    }
}

组件在它们所属的类的初始化期间创建并初始化,并通过addComponent(component: GKComponent)添加到components-array。

要使这些组件可以从Apples类外部访问,请始终使用调用componentForClass()的计算属性来返回相应的组件实例。

然而,

渲染组件是“每帧”访问的,这意味着在每个更新周期中我需要调用渲染组件,这将导致调用计算属性,这在我眼中会导致额外的和可避免的处理负载。

通话看起来像:

func update(withDeltaTime time: NSTimeInterval) {
    playerEntity.renderNode.DoSomethingPerFrame()
}

而不是这样,我就像下面这样做:

class PlayerEntity: GKEntity {
    // MARK: Components

    let renderComponent: RPRenderComponent
    var stateMachineComponent: RPStateMachineComponent!

    // MARK: Initialisation
    override init() {
        renderComponent = RPRenderComponent()
        super.init()
        renderComponent.node.entity = self

        stateMachineComponent = RPStateMachineComponent(states: [
            RPPlayerStandingState(entity: self),
            RPPlayerFallingState(entity: self),
            RPPlayerBouncingDownState(entity: self),
            RPPlayerBouncingUpState(entity: self),
            RPPlayerJumpingState(entity: self),
            RPPlayerBoostState(entity: self)
            ])
        addComponent(renderComponent)
        addComponent(stateMachineComponent)

    }
}

我没有使用计算属性访问组件,而是在我的类中对它进行了强有力的引用。在我看来,我在调用计算属性时避免了额外的开销,因为我避免了“计算”。

但我不确定为什么Apple使用计算属性做到了这一点。也许我对计算属性完全错了,或者只是因为这是编写该示例的人的编码风格!?

计算属性会影响性能吗?他们自动意味着更多的开销吗?

或者:

是否可以使用'安全'(在资源方面)使用这样的计算属性? (在我看来,计算属性尽管害怕相当优雅的解决方案,顺便说一句。)

1 个答案:

答案 0 :(得分:0)

这取决于 - 每次计算物业成本的金额,以及您进行计算的频率。

一般情况下,如果计算成本太低而且差别不大,则应使用计算属性,如果需要更长时间,则应使用计算属性。或者,如果计算属性通常返回相同的结果,则计算属性可以缓存其值。

使用得当,所涉及的成本非常低。您还需要建议一个易于使用且速度更快的计算属性的替代方法。