【问题标题】:XNA - Simulated snowXNA - 模拟雪
【发布时间】:2013-02-25 15:24:20
【问题描述】:

这更像是一个关于我应该使用哪种模式/方法的建议。我已经对此问题进行了一些调查 - 结果不佳。

基本上我有一个游戏的想法,其中关键的游戏机制是基于飘落的雪 - 或者,在这个想法游戏的情况下 - 飘落的粒子。

雪/颗粒需要从屏幕上掉下来 - 但会堆积成堆。问题是,当它们达到一定角度时,我需要下雪以“涓涓细流”桩的两侧,并继续积累。有可能在成堆的雪下面开洞,雪必须掉出来——想想就像沙漏掉沙漏一样。

我已经尝试过这是 Box2d - 很明显 Box2d 不是用于持续很长时间的 10,000 多个微小粒子的正确选择。 Box 2D 很快就死了。

我尝试在屏幕上绘制 1px 位图,但每次更新处理 10,000 次碰撞也证明性能不佳。

任何想法都将不胜感激。

干杯

【问题讨论】:

  • 你可能最终会成为 3dMark 的竞争对手......无论如何,10000 个持久粒子听起来像是 CUDA 的工作
  • 你能澄清一下 - 是 2d 还是 3d,雪是否只能通过从上方落下而积聚?如果你玩的区域是多大?
  • 我正在制作一个基于图块的 2d 平台游戏,当我以全高清绘制 200,000 个精灵时,它在 2008 年平庸的桌面上每秒给我 60 帧,所以我不认为应该关注 10'000 个精灵。碰撞逻辑可能存在缺陷,导致结果不佳,例如 OP 可能会在所有雪花之间运行检查,而其中一些距离太远而无法进行检查。
  • 您可以发布您的项目的链接吗?听起来很有趣 =)
  • @Stuart 理想情况下,游戏区域应该是全屏的——但游戏仍然可以使用更大的“雪”来减少精灵的数量...

标签: c# xna game-physics


【解决方案1】:

好吧,就像您发现的那样,没有任何现有的库可以帮助您,除非它非常专门针对您的场景。不幸的是,对于 XNA 来说,可供选择的东西并不多,而且看起来现有的粒子系统库都不支持粒子物理。

所以你需要自己做很多工作。首先,您需要考虑您可以做的所有优化。就像评论说的那样,你不应该在每一帧的所有粒子之间运行检查。您应该使用基于点的碰撞检查,而不是物理引擎通常使用的更高级的东西。在这种情况下,您应该确保粒子始终具有相同的大小(相对于参考坐标系,也就是说,这并不意味着您不能进行缩放)。当然,你需要尽可能多地跳过碰撞检查——你知道静止的粒子永远不应该被检查,就像那些在所有侧面都有相邻粒子的粒子一样——这让我想到了网格。也许您可以将整个“世界”表示为一个网格,并从这个角度简化逻辑 - 与 Minecraft 所做的几乎相同,您不同意吗?

无论如何,我意识到我有点漫无边际,但这是一个如此开放的主题...... :)

【讨论】:

    【解决方案2】:

    在这个很酷的效果上花很多时间(用于 XNA 和 MonoGame) http://www.int6.org/development/cool-effects-for-xna-monogame/

    没有雪景效果,但有一些趣味效果可以使用或修改。

    【讨论】:

      【解决方案3】:

      是否可以监控物理引擎实际正在处理哪些粒子?如果是这样,如果它们的速度小于 0.01 或类似的东西,是否有一种方法可以停止处理它们的物理,或严格限制处理的内容?

      如果你只处理需要处理的粒子,那么你可以拥有尽可能多的粒子,假设它们不是一次全部移动!

      如果这仍然是个问题,听起来流体动力学解决方案可能更合适,因为流体动力学基本上是一大堆小的移动粒子。

      这里有一些关于 2D 流体动力学的有趣信息:

      http://www.ibiblio.org/e-notes/webgl/gpu/fluid.htm

      您的物理引擎可能已经包含您需要的内容。

      【讨论】:

      • 不幸的是 - 雪是用户交互的 - 感谢您的回答:)
      • @DaveBish 你过得怎么样?
      猜你喜欢
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多