游戏如何删除数据库中的对象,但同时为其设置动画

Lan*_*ard 9 javascript animation asynchronous state-machine unity-game-engine

我想知道当您执行删除项目等操作时,动画等异步操作是如何工作的,因此想出了这种思维过程,并想从行业最佳实践角度看反馈是否有意义.

有两层:

  • 反应层.
  • 渲染层.

反应层立即发生,可以通过传统的事件调度完成.

这是您创建和删除数据的地方,所有这些都是即时发生的.

状态机会收到这些即时响应变化的通知.

然后状态机"转换".假设存在一些异步事件(动画,网络请求等),此过程会在一段时间内发生.这就是人们说"行动排队"时的意思.

然后渲染层将动作从动作队列中移出并渲染它.这样,对潜在的即时反应层有一种延迟的反应.

我的问题是,反应层是否也需要处理异步.例如,删除一些东西.

假设项目已删除,并且您想要将其设置为动画.有几种方法可以做到这一点:

  1. 排队删除操作,然后先将其设置为动画.动画完成后,再进行实际删除.如果动画中断(取消删除),则永远不会执行删除.
  2. 立即删除项目(反应层).动画层保持对项目的引用,因此即使从全局位置删除它,仍然可以进行动画.如果动画被取消,那么你将不得不做一个更复杂的"撤销"事情.

如果(1)是要走的路,那么就没有反应层,并且所有内容都是在考虑一种行动队列的情况下实现的.这使得制作可重用代码变得更加困难,因为所有内容都与动作队列的想法联系在一起.

如果(2)是要走的路,则有两个数据副本,全局副本和本地副本,它们是异步同步的.这样可以更容易地获得可重用的代码,但使其更加复杂.

想知道这是否有意义,并且如果这些方法中的任何一种在行业中是更好的实践(或者如果有替代方案我没有解决这个问题更有意义).

换句话说,有两种主要方法:

  1. 渴望:现在删除它,好吧我们删除它的所有人,时间回到里面.等待一切都重新回到称之为"完成".
  2. 谨慎:宣布"我们将删除它",然后等待一切都完成并返回内部实际删除.

想知道游戏和应用程序等如何处理这类事情.

更新

在以不同的方式思考之后,也许更像是海洋中海带的摇晃:

https://www.youtube.com/watch?v=gIeLCzR8EgA

我的意思是,有一个基础层是立即的(创建/删除),然后有一些中间层包含发生的所有事务(创建/删除)的副本,渲染层用于动画创建/删除.因此原始数据始终保持同步,但渲染层使用一种旧版本的数据,并发生所有更改的链.

反应层 - >事务层 - >渲染层.

另一种选择是标记为删除,然后只有在动画完成后才实际执行删除,但这看起来很糟糕.

更新

另一个版本:

  • 反应版
    • 始终拥有最新数据.(一个)
  • 渲染版
    • 是否有最后的数据(b),以及导致(a)的一系列变化.
    • 当渲染完成时,它将更改应用于(b),因此最终它就像(a).

Dav*_*zzi 1

根据我作为 Unity 游戏开发人员的经验,正确的决定是在中间,至于游戏引擎中的物理特性是近似的,因为半完美事物的感觉非常像完美事物。

解释是因为你的目标越现实、越现实,你需要的资源就越多,不仅是 CPU 和 GPU,还包括现金。

在这个奇怪的序言之后,我引用了标志选项,所应用的方法与普通的垃圾收集器没有太大不同,您标记了一个不再有用的项目,当垃圾收集器来时,他释放了该对象使用的内存空间,所以这个新的空间可以重复利用。

同样的过程是由很多引擎完成的,销毁操作是在渲染计算之前进行的。

最终目标始终是达成一个良好的中间解决方案。

有可能在引擎计算过程的每个时刻强制立即销毁,但这种解决方案总是被弃用。

对于动画,您通常使用的方式是在动画结束时或最后几帧中销毁(设置要销毁的标志)。至少你可以使用一些技巧让淡入淡出变得更愉快(比如粒子)。

真正的问题是,当您必须通过网络销毁对象(多人游戏)时,在这种情况下,您必须建立更容易参与的机器并选择它来计算物理和交互,该机器始终是服务器或至少主机(取决于游戏类型)。

我知道这个问题被标记为javascript问题,但我忍不住回答。

我还附上了 Unity 文档中有关 Destruct 函数的页面,解释了它们如何从游戏环境中删除项目:

https://docs.unity3d.com/ScriptReference/Object.Destroy.html

祝你今天过得愉快!和良好的编码。