2个问题:ArrayList替代?当我的鼠标退出时,如何阻止我的线程冻结?

时间:2014-03-26 21:44:04

标签: java

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);
    }
}

3 个答案:

答案 0 :(得分:1)

当然还有ArrayList的替代品,例如LinkedList或其他一些实现。但是这些都不是很慢,特别是当你一次只添加单个对象时。我所说的是你的滞后来源可能不是Bullet个实例添加到列表中。

那时你还有其他事吗?你的列表是同步的吗?还有其他锁吗?您的项目符号是否包含每次创建Bullet实例时可能从磁盘加载的映像文件? (磁盘I / O很慢,播放时不加载东西)

答案 1 :(得分:0)

  1. " but every single time I add or delete an object in that arraylist it laggs the game/thread.":我敢打赌,你有一个XY Problem,因为你的问题可能与ArrayList缓慢或造成延迟无关,而且所有与错误有关的事情都与你的代码,你需要找到一个未识别的错误。
  2. 你的游戏冻结了,因为你正在使用一些长时间运行的代码来捆绑Swing事件线程。要解决此问题,请在后台线程中执行长时间运行的代码,或者如果您需要的是动画,请使用Swing Timer。请查看Concurrency in Swing Tutorial

答案 2 :(得分:0)

问题#1只是我廉价的图形芯片。解决这个问题的一种方法。

问题#2当鼠标离开屏幕时游戏冻结。我添加到我的主类:this.addMouseMotionListener(i);这解决了它。