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

だから私はこれの速度を改善するためのより良い方法を探しています。

figureStageアクターを list( ) 内でソートしながら、アクターを更新するというアイデアに出くわしました。しかし、私は forall で更新を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 に答える