【发布时间】:2018-02-06 05:44:04
【问题描述】:
我想知道当您执行删除项目等操作时,动画等异步操作如何工作,因此想出了这种思考过程,并希望得到反馈,看看从行业最佳实践的角度来看它是否有意义。
有两层:
- 反应层。
- 渲染层。
反应层立即发生,可以通过传统的事件分派来完成。
这是您创建和删除数据的地方,这一切都是即时发生的。
状态机会收到这些即时反应更改的通知。
然后状态机“转换”。这个过程会在一段时间内发生,假设发生了一些异步的事情(动画、网络请求等)。这就是人们所说的“动作队列”的意思。
然后渲染层从动作队列中提取内容并渲染它。这种方式对底层的即时反应层有一种延迟反应。
我的问题是反应层是否也需要处理异步。例如,删除某些内容。
假设某个项目已被删除,并且您想为其制作动画。有几种方法可以做到这一点:
- 将删除操作排队,然后首先对其进行动画处理。动画完成后,进行实际删除。如果动画被中断(取消删除),则永远不会执行删除。
- 立即删除项目(反应层)。动画层保持对周围项目的引用,因此即使从全局位置删除它仍然可以执行其动画。如果动画被取消,那么您将不得不做一个更复杂的“撤消”之类的事情。
如果 (1) 是要走的路,那么就没有反应层,所有的实现都考虑到了一种动作队列。这使得编写可重用代码变得更加困难,因为一切都与动作队列的想法相关。
如果(2)是要走的路,那么数据有两个副本,全局副本和本地副本,它们异步保持同步。这使得拥有可重用代码更容易,但推理起来更复杂。
想知道这是否有意义,以及这些方法中的任何一种在行业中是否是更好的做法(或者是否有更有意义的替代方案我没有解决)。
换句话说,主要有两种方法:
- 渴望:现在删除它,好吧,我们已经删除它的每个人,是时候回到里面了。并等待一切恢复正常,然后将其称为“完成”。
- 小心:宣布“我们将删除它”,然后等到一切都完成后返回内部进行实际删除。
想知道游戏和应用等如何处理这类事情。
更新
换个角度想,或许更像是海带在海里的摇曳:
https://www.youtube.com/watch?v=gIeLCzR8EgA
我的意思是,有一个即时的基础层(创建/删除),然后是一些中间层,其中包含发生的所有事务(创建/删除)的副本,渲染层用于动画创建/删除。因此原始数据始终是同步的,但渲染层使用了一种旧版本的数据,其中包含发生的所有更改的链。
反应层->事务层->渲染层。
另一个选项是标记为删除,然后只有在动画完成后才真正执行删除,但这似乎很hacky。
更新
另一个版本:
- 反应版本
- 始终拥有最新数据。 (一)
- 渲染版本
- 具有最后一个数据 (b),以及导致 (a) 的一系列更改。
- 渲染完成后,它将更改应用于 (b),因此最终类似于 (a)。
【问题讨论】:
-
我会用第二种方法。不是因为它更容易,而是因为用户希望它立即被删除。可选地,可以添加一个“灰色”状态来锁定某些元素的使用。如果删除成功则完全删除,否则再次解锁
标签: javascript animation asynchronous unity3d state-machine