为啥游戏逻辑更喜欢 update() 而不是 didFinishUpdate?
Posted
技术标签:
【中文标题】为啥游戏逻辑更喜欢 update() 而不是 didFinishUpdate?【英文标题】:Why is update() preferred for game-logic rather than didFinishUpdate?为什么游戏逻辑更喜欢 update() 而不是 didFinishUpdate? 【发布时间】:2015-11-19 17:46:18 【问题描述】:在 SpriteKit 的编程指南中,update() 函数被称为实现您自己的游戏逻辑的最佳位置。 但是,当我意识到在 didFinishUpdate() 中将相机居中在节点上效果更好(避免延迟)时,我一直在使用该选项。
camera.position.y = node.position.y
害怕其他延迟问题,我还实现了我的游戏逻辑的其余部分。有用。 因此,他们推荐 update() 的原因是什么? 使用这两种方法是否有性能优势?
谢谢。
【问题讨论】:
【参考方案1】:没有性能优势,这实际上是确定游戏逻辑的先决条件的问题。您是否希望在计算物理和动作 WERE (didUpdate) 或 将 (update) 计算的假设下运行您的逻辑。例如 update 在处理任何物理和动作之前被调用。因此,如果您有诸如自定义物理计算之类的逻辑,生成一堵墙来阻挡物理体,或者甚至只是执行您想立即运行的动作,那么应该在 update 方法中完成,因为所有这些情况都期望物理和动作将是在当前帧计算。但是,在 didUpdate 中将节点居中放在相机上会很好,因为您希望在计算物理之后将相机居中。
还需要注意的是,update 方法会传递当前游戏时间,因此您需要使用 update 方法来计算帧之间的时间(AKA 增量时间)。这通常是必要的,例如计数以在 N 秒后执行逻辑或处理具有可变时间步长的自定义物理场。但是,这不会限制您使用 update 方法,因为您应该将当前增量时间保存在一个变量中,以便您可以从 didUpdate 方法和其他回调中访问它。
根据个人经验,我发现自己使用 update 方法比 didUpdate 更多,因为我经常有很多自定义物理和逻辑,通常假设我所做的更改将在当前帧中全部处理。但正如我上面所说,这取决于你的先决条件是什么。在某些情况下,您选择什么并不重要,因为逻辑可能与渲染周期无关。
我认为 Sprite Kit 文档中的这张图片让渲染循环的可视化变得更加容易。分析您的游戏逻辑并确定您的游戏逻辑在循环中的哪个点有意义。
【讨论】:
以上是关于为啥游戏逻辑更喜欢 update() 而不是 didFinishUpdate?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我应该更喜欢单个'await Task.WhenAll'而不是多个等待?
为啥 FetchContent 更喜欢子目录包含而不是安装依赖项?
为啥 Clojure 成语更喜欢返回 nil 而不是像 Scheme 这样的空列表?