java - 添加到 Android Studio 中的列表,性能问题
问题描述
几天前我发了这篇文章:Android Studio 中的 For-Each 循环问题
我进行了使用迭代器从 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));
}
}
}
但是,当我添加新草时,问题转移到了抖动问题。我不认为它的帧率下降(尽管这就是它的样子)。我假设修复将类似于迭代器(即使它没有“添加”方法)。
我正在使用 ArrayList,其他类型的列表会有所帮助吗?此外,我的目标是拥有一个充满无缝放置/移动的草的屏幕。最终我会随着时间的推移改变速度,并为游戏添加更多内容。目前我有完美的行,但产生它们是紧张的。“抖动”的副作用(我假设)是草在错误的 Y 坐标上产卵,它们聚集在一起。
编辑:我忘了提到错误信息是一样的。“并发修改异常”
解决方案
是的,不同的列表提供不同的实现,只是以不同的速度为不同的功能提供相同的结果。
例如,ArrayList 比 LinkedList 更适合循环。这是因为 ArrayList 属性可以通过索引直接访问,而不是必须遍历节点才能获得指定节点的链表。
TL/DR: - 链表更适合添加/删除功能。- 数组列表更适合获取/设置
我在大学学到了这一点,否则可能需要问同样的问题。
推荐阅读
- python - python奇数或偶数函数中的问题。返回 True 不起作用
- python - 使用 cmd 模块中的 cmdloop 时允许其他线程打印到标准输出
- javascript - Lodash:_.has 检查返回 false 的键
- github - Github 站点未找到 404
- android - Intent 应用程序/msword 不起作用 - 如何解决?
- wpf - 缺少“ExampleBrowser”程序集(命名空间)[helix-3d-toolkit]
- google-visualization - 如何在 Google 可视化 API 查询语言中转义列名?
- python - 如何正确定义 SQLAlchemy backrefs 以便它们可以反映?
- java - 如果我在 RecyclerView 项目中选择一个按钮,则会自动单击按钮
- node.js - 在 Windows 上运行 wiki.js 作为服务的正确 pm2 命令是什么?