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

时间:2018-02-06 05:44:05

标签: javascript animation asynchronous unity3d state-machine

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

有两层:

  • 反应层。
  • 渲染层。

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

这是您创建和删除数据的地方,这一切都是即时发生的。

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

然后状态机&#34;转换&#34;。假设存在一些异步事件(动画,网络请求等),此过程会在一段时间内发生。这就是人们说&#34;行动队列&#34;。

时的意思

然后渲染层将动作从动作队列中移出并渲染它。这样就会对潜在的即时反应层产生一种延迟反应。

我的问题是,反应层是否也需要处理异步。例如,删除某些内容。

说某个项目已删除,您想要将其设置为动画。有几种方法可以做到这一点:

  1. 排队删除操作,然后先将其设置为动画。动画完成后,再进行实际删除。如果动画中断(取消删除),则永远不会执行删除。
  2. 立即删除项目(反应层)。动画层保持对项目的引用,因此即使从全局位置删除它,仍然可以进行动画。如果动画被取消,那么你必须做一个&#34;撤消&#34;有点复杂的事情。
  3. 如果(1)是要走的路,那么就没有反应层,并且所有内容都是在考虑一种行动队列的情况下实现的。这使得制作可重用代码变得更加困难,因为所有代码都与行动队列理念联系在一起。

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

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

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

    1. 渴望:现在删除它,好吧我们已经删除了它,是时候回到里面了。然后等待所有的东西重新调用它来完成#34;完成&#34;。
    2. 谨慎:宣布&#34;我们将删除它&#34;,然后等待一切都完成后再回到内部实际进行删除。
    3. 想知道游戏和应用程序等如何处理这类事情。

      更新

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

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

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

      反应层 - &gt;交易层 - &gt;渲染层。

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

      更新

      另一个版本:

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

1 个答案:

答案 0 :(得分:0)

从我作为Unity游戏开发者的经验来看,正确的决定是在中间,因为游戏引擎中的物理学是近似的,因为半完美的事物的感觉非常像一个完美的感觉。

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

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

同样的过程由很多引擎完成,并且在渲染计算之前会出现destroy操作。

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

有可能在发动机计算过程的每个时刻强制进行即时销毁,但是这个解决方案总是被弃用。

通过动画,您通常使用的方式是在动画结束时或在最后几帧中销毁(设置要被破坏的标志)。 至少你可以使用一些技巧使褪色更有乐趣(如粒子)。

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

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

我还附上了关于Destruct函数的统一文档的页面,解释了他们如何管理从游戏环境中删除项目:

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

祝你有愉快的一天!和良好的编码。