Java:游戏中的优化算法

时间:2014-10-01 19:25:30

标签: 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)
        {
            ////////////////
            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();
                    }
                }
            }
            //////////////
        }
    }
}

7 个答案:

答案 0 :(得分:1)

  1. getActors().get(i)放入变量中,不要在外部if
  2. 中调用两次
  3. 内部if {/ 1>中的getActors().get(j)相同
  4. 在最内部的条件和身体
  5. 中使用这些变量
  6. 将大小保存在变量中,因为现在在检查for条件时每次迭代都会调用.size函数
  7. 您不应该使用可以在循环条件循环期间动态更改的大小(因为您要移动项目),这会将我们带回#4。 除了它非常好的编码风格视角,我怀疑你可以使它比我告诉你的更有效(除了使用线程)

答案 1 :(得分:1)

  1. 嗯,我的第一个想法是只检查“最近的”敌人而不是所有敌人。不知何故试图减少该列表的大小。
  2. 2.第二个 - 请检查您的情况并逐个检查 - 现在您总是检查2个条件。如果以后尝试放“重”,例如:

    从:

      if(getActors().get(i) != null && getActors().get(i) instanceof Enemy)
    

    到:

    if(getActors().get(i) != null) {
        if(getActors().get(i) instanceof Enemy)  {
           .....
        }
    } 
    

    3.调用你的getActors()。get(i)一次 - 保存到变量。 4.我在想为什么有必要检查一个actor是否为null,可能只是从列表中删除空值或将未初始化的actor保留在另一个列表中。也可以尝试使用Balls and Enemies,请不要将每个演员都放在一个列表中。

答案 2 :(得分:1)

由于你经常这样做,考虑将敌人和球存放在他们自己的结构中(列表或集合或其他任何工作)。这可以防止你循环通过你不需要的演员,并避免支票的实例。

答案 3 :(得分:0)

不要使用size(),定义变量 尽量不要施放。尽量不要使用例子。 也许,通过zsort或类似的方式对列表进行排序,这样你有时可以更快地启动和/或停止循环?

答案 4 :(得分:0)

增加其他参与者的(非常好的)建议:将敌人和射弹缓存在不同的结构中,这样你就不必检查它们到底是什么了。

尽可能多地使用时间与空间的权衡:正如Tomek所暗示的那样,标准方法是在这种情况下通过修剪不能使用的敌人和射弹来减少检查次数(=迭代次数)可能在当前帧内发生碰撞(它们是远的)。

无论如何,提出建议:继续游戏,尽可能多地完成游戏,以便它能正常运行(如果速度慢),只有然后才能进行优化。

那是因为

  1. 通过这种方式先发制人地优化你永远不会完成它
  2. 你可能不知道最终游戏的确如何:或许在完成90%之后,你会看到一些简单的优化机会。

答案 5 :(得分:0)

我会稍微改写模型,所以他们可以测试交集本身,然后像那样删除(可能它仍然可以改进)

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

答案 6 :(得分:0)

正如其他人所说,对速度的真正改进将是两个集合,一个带球,另一个带有敌人。至于使它看起来更好,你可以这样:

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