【问题标题】:Android - Collision Detection / Engine Optimization - Large, Open, Sandbox MapsAndroid - 碰撞检测/引擎优化 - 大型、开放、沙盒地图
【发布时间】:2012-07-28 16:44:45
【问题描述】:

短版

在动态生成对象的大型开放地图中检测碰撞的性能友好方式是什么?

加长版

我目前正在重新创建我制作的第一款 Android 游戏 (https://play.google.com/store/apps/details?id=com.Joey_Ant.Lite&feature=search_result#?t=W251bGwsMSwyLDEsImNvbS5Kb2V5X0FudC5MaXRlIl0.)

我正在从头开始重建它并添加大约一百个新功能。

游戏说明:用户将控制一个蚁群,该蚁群有一个基于网格的地下地图和一个地上开放的运动场。蚂蚁会有人工智能,可能会有大量的蚂蚁。 (这意味着我需要优化所有东西。)地图将是高度可变的。 (我打算做一个地图创建器,让用户在线创建和下载地图。)

那么,在充满大量物体和其他蚂蚁/生物的地图中,检测碰撞的最佳方法是什么?我不能循环遍历所有其他对象来检测碰撞,因为每个生物都必须发生这种情况,并且会占用过多的 CPU 时间。

我的考虑

Grid:创建任意网格对象。网格对象将创建子区域(实际网格)并且每次生物“思考”。它将使用对自身的引用来更新网格对象。然后,该生物将向网格对象询问其网格内的其他对象。这有望大大减少需要进行的检查次数。但是这样做的开销可能更多。这个网格可能也有利于允许生物检测其一般区域内的其他生物,因为 AI 决策将受到该区域内的其他物体和生物的影响。

Occupied Grids:与上面的grid选项基本相同,只是grid对象是由objects创建的。假设我有 3 个对象(A、B 和 C)。当我初始化对象 A 时,它会创建一个具有指定宽度和高度的网格单元。对象 B 已初始化,但与对象 A 位于同一区域,因此它将自身添加到该网格区域。对象 C 在区域外初始化,因此它为其位置创建了一个网格单元。如果对象 C 进入对象 A 所在的单元格,则其前一个单元格被破坏。我猜你可以把它想象成吹泡泡。

有更好的方法来做到这一点吗?

【问题讨论】:

    标签: android optimization collision-detection game-engine


    【解决方案1】:

    这是一个相当古老的问题,我不知道您是否找到了解决方案,但为什么不使用已经开发的碰撞检测和物理引擎之一,而不是发明热水。以下是一些可能性:

    1. androidbox2d

    2. andengine

    也有很好的例子如何使用它们。

    【讨论】:

    • 我确实在我的问题中做了第二个选项。我目前正在研究多个移动物体之间的路径查找。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    相关资源
    最近更新 更多