2013-09-29 119 views
0

好現在的問題是:渲染/排序優化

  1. 我確實有這確實需要自上一幀
  2. 名單要由時間更新的對象的列表,需要由訂購

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

現在我這樣做有collection.sort和簡單comperator對象Y的koordinate

渲染確實是這樣的:

@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),而我更新了這些。但正如我所做的更新與this.figureStage.act();我無法做到這一點。

所以我的問題是,如果有任何解決方案沒有排序算法的複雜性總是有這些對象按其位置排序?

+1

您是否可以將演員放在SortedSet中,以便始終對演員進行排序,而不必完全重新排序? – Joni

+0

不確定,因爲它們在運行時確實會改變它們的y位置。 – BennX

+0

發生這種情況的頻率如何? – Joni

回答

0

在@Joni的幫助下,我開始使用differend算法對Actors進行排序。它確實通過使用插入物將分選速度提高了大約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!

1

您可以將對象存儲在HEIGHT元素的數組(或列表)中,其中HEIGHT是您的世界的垂直大小。該列表中的每個元素都是具有相應Y座標的對象列表。 當一個物體向上或向下移動時,它應該從一個列表中刪除,並根據其新的Y座標添加到另一個列表中。 這樣你可以迭代數組並繪製內部列表中的所有對象。 如果Y座標不是整數,則可以使用它的整數部分。 希望這有助於。