2013-09-29 88 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坐标不是整数,则可以使用它的整数部分。 希望这有助于。