0

好的,问题来了:

  1. 我确实有一个对象列表,自上一帧以来确实需要更新
  2. 列表需要在绘制之前按对象的 y 坐标排序

目前我用一个collection.sort和一个简单的比较器来做到这一点:

figureComperator = new Comparator<Actor>() {
    @Override
    public int compare(Actor o1, Actor o2) {
        return (int) o2.getY() - (int) o1.getY();
    }
};

渲染看起来像这样:

@Override
public void render(float delta) {
    // clearing
    Gdx.gl.glClearColor(0, 0, 0, 1f);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    // act the character act in front
    this.character.myAct(delta);
    updateGameCam();
    if (this.status == GameStatus.GAME) {
        // just monster act now
        this.figureStage.act();
    }
    this.figureStage.getActors().sort(figureComperator); // sort figures
    // render background
    this.map.drawBackground(); // draw background
    // draw figures inclusive character
    this.figureStage.draw(); //draw all figures
    this.map.drawForeground(); // foreground

    // render game HUD and act gameHud
    this.gameHud.act(delta);
    this.gameHud.draw();
}

所以我正在寻找一种更好的方法来提高速度。

我确实遇到了让演员在 list( figureStage) 中进行自我排序的想法,而我确实更新了这些。但是当我使用它进行更新时,this.figureStage.act();它不能那么容易。

所以我的问题是,是否有任何解决方案没有排序算法的复杂性来始终让这些对象按其位置排序?

4

2 回答 2

1

您可以将对象存储在大小为 HEIGHT 元素的数组(或列表)中,其中 HEIGHT 是您的世界的垂直大小。此列表中的每个元素都是具有相应 Y 坐标的对象列表。当一个对象向上或向下移动时,它应该从一个列表中删除,并根据其新的 Y 坐标添加到另一个列表中。这样您就可以迭代数组并在内部列表中绘制所有对象。如果 Y 坐标不是整数,您可以使用它的整数部分。希望这可以帮助。

于 2013-09-29T14:16:38.330 回答
0

在@Joni 的帮助下,我开始使用不同的算法对演员进行排序。仅通过使用插入排序,它确实将排序速度提高了大约 2-3 倍。

    public void sortList(Array<Actor> array) {
//      double starttime = System.nanoTime();
        for (int i = 1; i < array.size; i++) {
            Actor temp = array.get(i);
            int j = i - 1;

            while (j >= 0 && array.get(j).getY() < temp.getY()) {
                array.set(j + 1, array.get(j));
                j--;
            }
            array.set(j + 1, temp);
        }
//      System.out.println("Time taken: " + (System.nanoTime() - starttime));
    }

Collection.sort 的平均 ns 约为 8700。插入是3300左右!

于 2013-09-29T14:16:00.507 回答