在Android Studio中添加到列表时,性能问题

时间:2018-07-19 00:54:33

标签: java android arraylist iterator

几天前,我发表了这篇文章:Issues with a For-Each loop in Android Studio

我进行了建议的更改,即使用迭代器从ArrayList中删除对象,并且停止了删除项目的性能问题。这是更新的update()方法:

public void update(){
        float elapsedTime = (startTime - System.currentTimeMillis());
        startTime = System.currentTimeMillis();

        float speed = Constants.SCREEN_HEIGHT/10000.0f;


        Iterator<Grass> i = grasses.iterator();
        while(i.hasNext()){
            Grass g = i.next();
            g.incY(speed * elapsedTime);

            if(g.getRect().top > Constants.SCREEN_HEIGHT){
                int currY = 0;
                int currX = g.getRect().left;
                i.remove();
                grasses.add(new Grass(currX, currY));

            }
        }
    }

populateGrass方法是相同的:

 private void populateGrass() {
       for(int j = 0; j < ((double) Constants.SCREEN_HEIGHT / grassSize) + 1; j++) {
           yStart = grassSize * (-2 + j);
           for (int i = 0; i < (double) Constants.SCREEN_WIDTH / grassSize; i++) {
                xStart = i * grassSize;
                grasses.add(new Grass(xStart, yStart));
            }
        }
    }

但是,当我添加新草时,问题就转移到了抖动问题上。我不认为它的帧率下降(尽管那是它的样子)。我认为修复将类似于Iterator(即使它没有“ add”方法)。

我正在使用ArrayList,其他类型的列表会有所帮助吗? 我的目标也是让屏幕充满了无缝放置/移动的草地。最终,病态会随着时间改变速度,并为游戏添加更多内容。目前,我有完美的行,但是生成它们会令人不安。而且“抖动”(我认为)的副作用是草在错误的Y坐标上生成,它们聚在一起。

编辑:我忘了提到错误消息是相同的。 “ ConcurrentModificationException”

1 个答案:

答案 0 :(得分:0)

是的,不同的列表提供了不同的实现,这些实现以不同的速度为不同的功能提供了相同的结果。

例如,与LinkedList相比,ArrayList更适合循环。这是由于ArrayList属性可以通过索引直接访问,而链表则必须遍历节点才能获得指定的节点。

TL / DR: -链接列表更适合添加/删除功能。 -数组列表更适合获取/设置

我是在大学里学到的,否则可能需要问同样的问题。

参考: https://dzone.com/articles/arraylist-vs-linkedlist-vs