相关疑难解决方法(0)

Java并发:用很少的线程执行许多"无限"任务

我正在为一组N粒子构建一个(并发)模拟器,这些粒子根据牛顿定律在空间中移动.我的想法是将每个粒子建模为一个任务,它与其他粒子(任务)相互作用,以获得它们的位置和质量,以便计算它所受的净力.每个粒子任务都是如此

while(true){
   force = thisParticle.calculateNetForce(allTheParticles);
   thisParticle.waitForAllTheParticlesToCalculateNetForce(); // synchronization
   thisParticle.updatePosition(force);
   thisParticle.waitForAllTheParticlesToUpdateTheirState(); // synchronization
}
Run Code Online (Sandbox Code Playgroud)

我可以拥有大量粒子(100或更多),因此我无法创建如此多的Java线程(映射到物理线程).我的想法是使用Runtime.getRuntime().availableProcessors()+1可以执行许多任务的线程.

但是,我不能使用FixedThreadExecutor,因为粒子任务不会结束.我想使用FixedThreadExecutor,它必须也能够在内部执行某种调度.你知道为此目的吗?

或者,您是否可以通过并发的角度(例如,不同的任务分解)向我建议更好的方法来建模这样的系统?

Ps:我仅限于"经典"并发机制,不包括演员或类似的架构.

java concurrency executors

10
推荐指数
2
解决办法
827
查看次数

有效地绘制大量粒子

我写了一个粒子系统小程序; 目前我正在创建,并分别绘制每个粒子.(这是代码)

BufferedImage backbuffer;
Graphics2D g2d;

public void init(){
    backbuffer = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
    g2d = backbuffer.createGraphics();
    setSize(WIDTH, HEIGHT);

    //creates the particles
    for (int i = 0; i < AMOUNTPARTICLES; i++) {
        prtl[i] = new particleO();
        prtl[i].setX(rand.nextInt(STARTX));
        prtl[i].setY(rand.nextInt(STARTY));
        prtl[i].setVel(rand.nextInt(MAXSPEED)+1);
        prtl[i].setFAngle(Math.toRadians(rand.nextInt(ANGLESPREAD)));

        }

    //other code
}



    public void update(Graphics g) {        

    g2d.setTransform(identity);

    //set background
    g2d.setPaint(BGCOLOUR);
    g2d.fillRect(0,0,getSize().width,getSize().height);
    drawp();
    paint(g);           
    }


public void drawp() {

    for (int n = 0; n < AMOUNTPARTICLES; n++) {

    if (prtl[n].getAlive()==true){
            g2d.setTransform(identity);
            g2d.translate(prtl[n].getX(), prtl[n].getY());
            g2d.setColor(prtl[n].getColor());

            g2d.fill(prtl[n].getShape());


            }
    }

} …
Run Code Online (Sandbox Code Playgroud)

java algorithm performance graphics2d

6
推荐指数
1
解决办法
1502
查看次数

2D游戏中有效的碰撞算法?

我正在按照教程编写一个用Java 编写的炸弹人(这是我的第一个游戏).本教程建议使用以下代码检测冲突.

        for (int p=0; p<entities.size(); p++) {
            for (int s=p+1; s<entities.size(); s++) {
                Entity me = (Entity) entities.get(p);
                Entity him = (Entity) entities.get(s);

                if (me.collidesWith(him)) {
                    me.collidedWith(him);
                    him.collidedWith(me);
                }
            }
Run Code Online (Sandbox Code Playgroud)

到目前为止,实体是一个包含敌人和玩家的数组列表.因为我还想检测玩家与墙壁发生碰撞,我是否应该将每个墙壁或砖块放入实体arraylist中?如果是这样,这个算法效率不高吗?这些瓷砖不会与其他瓷砖碰撞,所以我想在不同的列表中管理游戏实体.你有什么建议?有没有更有效的算法呢?

注意:我已经阅读了与2D游戏中的碰撞有关的其他问题.非常感谢.

java 2d collision-detection memory-efficient

4
推荐指数
1
解决办法
6418
查看次数