1) 所以我有一个游戏,其中一个大炮射击子弹,它在一个arraylist中添加Bullet.class,但每次我添加或删除该arraylist中的对象它落后于游戏/线程。除了Bullet []数组之外还有其他ArrayList替代方案吗?
解决:它是我的显卡。 LOL。
2) 我也在游戏中使用鼠标,但当鼠标离开游戏窗口时,游戏会冻结。我认为这是因为它在同一个线程中运行,但我仍然不太确定。我怎么能让这个问题停止?
Bullet Class:
import java.awt.Rectangle;
import java.util.ArrayList;
public class Bullet {
public static ArrayList<Bullet> bullets = new ArrayList<Bullet>();
private int id;
private double velX, velY, x, y;
private double r;
private boolean isAlive;
public int getId(){return id;}
public double getX(){return x;}
public double getY(){return y;}
public double getVelX(){return velX;}
public double getVelY(){return velY;}
public double getRotation(){return r;}
public boolean isAlive(){return isAlive;}
public Rectangle getBounds(){Rectangle r = new Rectangle((int)x-32, (int)y-12, 32, 32); return r;}
public void setX(double x){this.x = x;}
public void setY(double y){this.y = y;}
public void setVelX(double x){this.velX = x;}
public void setVelY(double y){this.velY = y;}
public void remove(){this.isAlive = false;}
public Bullet(int x, int y, double r, double velX, double velY){
this.x = x;
this.y = y;
this.velX = velX;
this.velY = velY;
this.r = r;
this.isAlive = true;
bullets.add(this);
}
}
答案 0 :(得分:1)
当然还有ArrayList的替代品,例如LinkedList或其他一些实现。但是这些都不是很慢,特别是当你一次只添加单个对象时。我所说的是你的滞后来源可能不是Bullet
个实例添加到列表中。
那时你还有其他事吗?你的列表是同步的吗?还有其他锁吗?您的项目符号是否包含每次创建Bullet
实例时可能从磁盘加载的映像文件? (磁盘I / O很慢,播放时不加载东西)
答案 1 :(得分:0)
" but every single time I add or delete an object in that arraylist it laggs the game/thread."
:我敢打赌,你有一个XY Problem,因为你的问题可能与ArrayList缓慢或造成延迟无关,而且所有与错误有关的事情都与你的代码,你需要找到一个未识别的错误。 答案 2 :(得分:0)
问题#2当鼠标离开屏幕时游戏冻结。我添加到我的主类:this.addMouseMotionListener(i);这解决了它。