我正在使用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使用计算属性做到了这一点。也许我对计算属性完全错了,或者只是因为这是编写该示例的人的编码风格!?
计算属性会影响性能吗?他们自动意味着更多的开销吗?
或者:
是否可以使用'安全'(在资源方面)使用这样的计算属性? (在我看来,计算属性尽管害怕相当优雅的解决方案,顺便说一句。)
答案 0 :(得分:0)
这取决于 - 每次计算物业成本的金额,以及您进行计算的频率。
一般情况下,如果计算成本太低而且差别不大,则应使用计算属性,如果需要更长时间,则应使用计算属性。或者,如果计算属性通常返回相同的结果,则计算属性可以缓存其值。
使用得当,所涉及的成本非常低。您还需要建议一个易于使用且速度更快的计算属性的替代方法。