对象生成,更新和删除

时间:2016-02-23 16:37:39

标签: java arrays performance for-loop libgdx

我目前正在Android Studio上使用JAVA创建游戏,以便在Android和IOS上发布。我们的libGDX库依赖项包括Box2D和FreeType。游戏的设计旨在使用户经常与屏幕上的多个对象(Individual Box2D机构)进行交互(通过触摸输入)。在任何给定时间最多存在30个对象。当前版本的游戏将对象存储在一个数组中并在它们被“评分”或“丢失”后销毁它们(当一个对象超越屏幕长度而没有被采取行动时会发生丢失)。随着游戏的进行,对象的生成速度更快,对象的速度也随之增加。随着游戏的进行,我们遇到了一些滞后现象,并认为这是由于'for'循环用于更新,渲染和检查以查看对象是否已被破坏。有多达30种形状,我们认为这是一种效率低下的方法,但不确定替代方案是什么。以下是结构示例:

// Updates shapes in the array and removes them from the array if necessary
for (int i = 0; i < randomShapes.size(); i++) {
    randomShapes.get(i).update(delta);
    if(randomShapes.get(i).isDestroyed()) {
        randomShapes.get(i).dispose();
        randomShapes.remove(i);
    }
}

我们尝试实现池数据结构。在线阅读后,池应该用于经常添加/删除的对象。我们的团队认为这是正确的方法,可以解决我们的滞后问题。虽然池使初始化一个新对象更便宜(因为初始化只发生一次),我们仍然经历滞后(可能比以前更糟)并且仍然无法找到消除'for'循环的方法。以下是结构示例:

// Updates shapes in the array and removes them from the array if necessary
for (RandomShape shape: activeShapes) {
    shape.update(delta);
    if(shape.isDestroyed()) {
        activeShapes.removeValue(shape, true);
        //activeShapes.removeIndex(i);
        shapePool.free(shape);
        System.out.println("SHAPES AVAILABLE: " + shapePool.getFree());
        System.out.println("MAX SHAPES: " + shapePool.max);
    }
}

对于需要更新多个被破坏并每秒添加的唯一对象的游戏,运行数组或池的更有效方法是不涉及实现不断循环的'for'循环元素?

0 个答案:

没有答案