循环使用迭代器与临时对象以图形方式给出不同的结果(Libgdx / Java)

时间:2013-07-29 19:13:55

标签: iterator render libgdx

我有一个粒子“引擎”我正在实现一个Pool系统,我已经测试了两种不同的方法来渲染列表中的每个粒子。请注意,Pooling确实没有任何问题要做。我只是按照教程并尝试使用第二种方法,当我发现它们表现不同时。

第一种方式:

            for (int i = 0; i < particleList.size(); i++) {
            Iterator<Particle> it = particleList.iterator();
            while (it.hasNext()) {
                Particle p = it.next();
                if (p.isDead()){
                    it.remove();
                }

                p.render(batch, delta);
            }
        }

哪种方法效果很好。我的粒子很锋利,它们以正确的速度移动。

第二种方式:

            Particle p;
        for (int i = 0; i < particleList.size(); i++) {
            p = particleList.get(i);
            p.render(batch, delta);

            if (p.isDead()) {
                particleList.remove(i);
                bulletPool.free(p);
            }

        }

这让我的所有粒子模糊不清,移动得非常慢!

我的粒子的渲染方法如下所示:

    public void render(SpriteBatch batch, float delta) {
    sprite.setX(sprite.getX() + (dx * speed) * delta * Assets.FPS);
    sprite.setY(sprite.getY() + (dy * speed) * delta * Assets.FPS);
    ttl--;
    sprite.setScale(sprite.getScaleX() - 0.002f);

    if (ttl <= 0 || sprite.getScaleX() <= 0)
        isDead = true;

    sprite.draw(batch);
}

为什么不同的渲染方法会提供不同的结果?

提前致谢

1 个答案:

答案 0 :(得分:2)

在迭代它时,您正在改变(从中删除元素)列表。这是制作混乱的经典方法。

Iterator必须具有正确处理删除案例的代码。但是基于索引的for循环没有。特别是当您致电particleList.remove(i)时,i现在与列表内容“不同步”。考虑当你删除索引3处的元素时会发生什么:'i'将增加到4,但旧元素4被拖曳到索引3中,因此它将被跳过。

我假设您正在避免Iterator以避免内存分配。因此,解决此问题的一种方法是反转循环(从particleList.size()向下转到0)。或者,您只能为非死粒子增加i