【问题标题】:Too many box2d objects makes my game slowly太多的 box2d 对象让我的游戏变慢了
【发布时间】:2014-10-07 08:14:36
【问题描述】:

我正在使用 Cocos2d 编写一个 iOS 游戏。一个屏幕中有很多球(大约 7000 个对象)。

触摸屏幕时,该区域内的小球应该会爆炸,周围的小球应该被填满。

我为它们中的每一个创建了一个 box2d 对象并将其添加到物理世界中。

问题如下。

  1. 最初,当没有触摸事件时,屏幕被 7000 个球填满,如果我们启动物理,它们会相互重叠,屏幕顶部会出现间隙。

  1. 触摸屏幕时,游戏运行非常缓慢。

如何才能让游戏流畅?

【问题讨论】:

  • 7,000 个球。每个球都接触其他 6 个球。那是 42,000 个接触点。每个都有自己的力量,动量等......来计算。以 60FPS(你应该是)运行,你有 16 毫秒的时间来完成每一帧的所有事情。完成其他工作(绘图等)后,它可能会为您提供 4 或 5 毫秒的物理时间。这是每个接触点 95 纳秒。不管你做什么都不会发生。

标签: ios cocos2d-iphone collision-detection game-physics box2d-iphone


【解决方案1】:

如何才能让游戏流畅?

减少球的数量。启用了 7000 个物理,碰撞物体纯粹是矫枉过正。即使是 700 也很多。

在任何情况下都没有快速解决此问题的方法。您可以尝试减少 box2d 世界时间步长中的位置和速度迭代次数,并且不要使用碰撞回调方法(不要设置碰撞委托),仅此而已。

【讨论】:

  • 那怎样才能实现球流下来的效果呢?
  • 非常广泛的问题,但实际上它经常使用启用物理的球来实现。然而,像我的水在哪里和给我喂油这样的游戏使用的球要少得多,一个自定义渲染器可以将多个球组合起来看起来像更大的流体,甚至可能是专门为这项任务制作的定制物理。如果您看过 PC 上的技术演示,就会发现完全在 GPU(显卡)上运行的流体模拟(也有很多小球)以达到一半的帧速率。
  • 您可能想尝试减少速度和位置积分步骤,这是唯一可能有助于提高性能的方法。并且在任何情况下都避免实现碰撞回调,即使它们不运行任何代码,调用它们的开销对于 7000 个球来说都是显而易见的。
  • 您能推荐任何实现前 2 个图形的解决方案吗?
猜你喜欢
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多