Java:游戏中的优化算法

Java:游戏中的优化算法,java,android,algorithm,libgdx,scene2d,Java,Android,Algorithm,Libgdx,Scene2d,我正在用scene2d创建一个游戏(Java) 我写了一个碰撞检测的函数,但我认为这是一个糟糕的函数。看起来很糟糕 我如何优化它?使更快更漂亮 private void deleteEnemies() { for(int i = 0; i < getActors().size - 1; i++) { if(getActors().get(i) != null && getActors().get(i) instanceof Enemy)

我正在用scene2d创建一个游戏(Java)

我写了一个碰撞检测的函数,但我认为这是一个糟糕的函数。看起来很糟糕

我如何优化它?使更快更漂亮

private void deleteEnemies()
{
    for(int i = 0; i < getActors().size - 1; i++)
    {
        if(getActors().get(i) != null && getActors().get(i) instanceof Enemy)
        {
            ////////////////
            for (int j = 0; j < getActors().size - 1; j++)
            {
                if(getActors().get(j) != null && getActors().get(j) instanceof Ball)
                {
                    if (actorsIntersecting(getActors().get(i), getActors().get(j)))
                    {
                        getActors().get(i).remove();
                        getActors().get(j).remove();
                    }
                }
            }
            //////////////
        }
    }
}
private void deleteEquals()
{
对于(int i=0;i
  • getActors().get(i)
    放在变量中,如果
  • getActors()相同。在内部if中获取(j)
  • 在最内部的if条件和主体中使用这些变量
  • 将大小保存在变量中,因为现在检查for条件时,每次迭代都会调用
    .size
    函数
  • 对于循环条件,您不应该使用可以在循环过程中动态更改的大小(因为您在执行过程中会删除项目),这会让我们回到#4。 除此之外,从编码风格的角度来看,这几乎没什么问题,我怀疑你能比我告诉你的更有效(除了使用线程)
  • getActors().get(i)
    放在变量中,如果
  • getActors()相同。在内部if中获取(j)
  • 在最内部的if条件和主体中使用这些变量
  • 将大小保存在变量中,因为现在检查for条件时,每次迭代都会调用
    .size
    函数
  • 对于循环条件,您不应该使用可以在循环过程中动态更改的大小(因为您在执行过程中会删除项目),这会让我们回到#4。 除此之外,从编码风格的角度来看,这几乎没什么问题,我怀疑你能比我告诉你的更有效(除了使用线程)
  • getActors().get(i)
    放在变量中,如果
  • getActors()相同。在内部if中获取(j)
  • 在最内部的if条件和主体中使用这些变量
  • 将大小保存在变量中,因为现在检查for条件时,每次迭代都会调用
    .size
    函数
  • 对于循环条件,您不应该使用可以在循环过程中动态更改的大小(因为您在执行过程中会删除项目),这会让我们回到#4。 除此之外,从编码风格的角度来看,这几乎没什么问题,我怀疑你能比我告诉你的更有效(除了使用线程)
  • getActors().get(i)
    放在变量中,如果
  • getActors()相同。在内部if中获取(j)
  • 在最内部的if条件和主体中使用这些变量
  • 将大小保存在变量中,因为现在检查for条件时,每次迭代都会调用
    .size
    函数
  • 对于循环条件,您不应该使用可以在循环过程中动态更改的大小(因为您在执行过程中会删除项目),这会让我们回到#4。 除此之外,从编码风格的角度来看,这几乎没什么问题,我怀疑你能比我告诉你的更有效(除了使用线程)
  • 嗯,我的第一个想法是只检查“最近的”敌人,而不是全部。设法缩小列表的大小
  • 二,。第二个-请逐个检查您的和条件-现在您总是检查两个条件。如果稍后出现以下情况,请尝试添加“更重”,例如:

    发件人:

    致:

    3.调用getActors().get(i)一次性-保存到变量。 4.我在想,为什么有必要检查一个参与者是否为null,也许只是从列表中删除null,或者将未初始化的参与者保留在另一个列表中。也可以用球和敌人来试试,请不要把每个演员都放在一张单子上

  • 嗯,我的第一个想法是只检查“最近的”敌人,而不是全部。设法缩小列表的大小
  • 二,。第二个-请逐个检查您的和条件-现在您总是检查两个条件。如果稍后出现以下情况,请尝试添加“更重”,例如:

    发件人:

    致:

    3.调用getActors().get(i)一次性-保存到变量。 4.我在想,为什么有必要检查一个参与者是否为null,也许只是从列表中删除null,或者将未初始化的参与者保留在另一个列表中。也可以用球和敌人来试试,请不要把每个演员都放在一张单子上

  • 嗯,我的第一个想法是只检查“最近的”敌人,而不是全部。设法缩小列表的大小
  • 二,。第二个-请逐个检查您的和条件-现在您总是检查两个条件。如果稍后出现以下情况,请尝试添加“更重”,例如:

    发件人:

    致:

    3.调用getActors().get(i)一次性-保存到变量。 4.我在想,为什么有必要检查一个参与者是否为null,也许只是从列表中删除null,或者将未初始化的参与者保留在另一个列表中。也可以用球和敌人来试试,请不要把每个演员都放在一张单子上

  • 嗯,我的第一个想法是只检查“最近的”敌人,而不是全部。设法缩小列表的大小
  • 二,。第二个-请逐个检查您的和条件-现在您总是检查两个条件。如果稍后出现以下情况,请尝试添加“更重”,例如:

    发件人:

    致:

    3.调用您的getActors().get(i)一次
      if(getActors().get(i) != null && getActors().get(i) instanceof Enemy)
    
    if(getActors().get(i) != null) {
        if(getActors().get(i) instanceof Enemy)  {
           .....
        }
    } 
    
    private void deleteEnemies () {
        List<Actor> actors = getActors();
        List<Actor> toRemove = new ArrayList<Actor>();
        int actorsSize = actors.size();
        Actor first = null, second = null;
        for(int i = 0; i < actorsSize; ++i) {
            first = actors.get(i);
            for(int j = 0; j < actorsSize; ++j) {
                if(i == j) continue;
                second = actors.get(j);
                if(first.intersects(second)) {
                    toRemove.add(first);
                    toRemove.add(second);
    
                }
            }
        }
        actors.removeAll(toRemove);
    } 
    
    for (Actor enemy : getActors()) {
        if (enemy != null && enemy instanceof Enemy) {
            for (Actor ball : getActors()) {
                if (ball != null && ball instanceof Ball && actorsIntersecting(enemy, ball)) {
                    ball.remove();
                    enemy.remove();
                }
            }
        }
    }