2016-11-30 3 views
0

私はlibGdxでシンプルなカスタムアクターを作った。複数のカスタムアクターのパフォーマンスをレンダリングするLibGdx

public class HealthBar extends Actor { 
private Texture background; 
private Texture bar; 
private float max; 
private float current; 

public HealthBar(Color bgColor, Color barColor) { 
    Pixmap bgPixmap = new Pixmap(1, 1, Pixmap.Format.RGB565); 
    bgPixmap.setColor(bgColor); 
    bgPixmap.drawPixel(0, 0); 
    background = new Texture(bgPixmap); 
    bgPixmap.dispose(); 
    Pixmap barPixmap = new Pixmap(1, 1, Pixmap.Format.RGB565); 
    barPixmap.setColor(barColor); 
    barPixmap.drawPixel(0, 0); 
    bar = new Texture(barPixmap); 
    barPixmap.dispose(); 
} 

@Override 
public void draw(Batch batch, float parentAlpha) { 
    batch.draw(background, getX(), getY(), getWidth(), getHeight()); 
    batch.draw(bar, getX(), getY(), getBarEnd(), getHeight()); 
} 

private float getBarEnd() { 
    return current/max * getWidth(); 
} 

public void setHealth(float current, float max) { 
    this.current = current; 
    this.max = max; 
} 

public void dispose(){ 
    background.dispose(); 
    bar.dispose(); 
} 

}グループステージ2dに約30本のレンダリング

I'am。

このレンダリングでは、毎秒約20フレームのコストがかかります。同じ数のシンプルなラベルをレンダリングすると、パフォーマンスに目に見える影響はありません。私はこのコードで何かを見逃していますか?これらのアクターは、Stageを使用してレンダリングされるグループに追加されます。 performance with draw() content commented

答えて

2

performance when drawing

あなたの背景のための別々のテクスチャオブジェクトを作成することにより、あなたはあなたのHealthBarsの各1を描画するために二回フラッシュする必要がありますするSpriteBatchを引き起こしています。 SpriteBatchは、描画のためにサブミットされた最後のテクスチャと一致しないテクスチャを描画するコマンドを受け取るたびにフラッシュする必要があります。

(関係のない、だけでなく、それは同じテクスチャのように多くのコピーを作成することは非常に無駄である - 。それは、単一の白画像を作成するために、より多くの意味を行い、すべてのヘルスバーがそれを使用する必要があります)

これを行う正しい方法は、あなたのUIで使用される残りの画像とともにTextureAtlasにソリッドな白い画像を置き、それをあなたの俳優で使用することです。バックグラウンドを描画する前にバッチにsetColorを呼び出してから、白いテクスチャ領域を任意の色のように見せるようにバーを呼び出すことができます。これにより、バッチフラッシュが大幅に削減または削除されます(ステージがすべて描画された最後のものを除く)。

しかし、非常にローエンドの電話機やAndroidエミュレータでテストしている場合を除き、追加の60回のバッチフラッシュでは、通常、このような大きなフレームレートの低下はありません。 Androidエミュレータは、デバイス上で実際のパフォーマンスを感じるのに役に立たない。

+0

ありがとうございました!バッチはflush()メソッドを呼び出すときにだけフラッシュされます。それはローエンドのAndroidデバイスでテストされました。 Nvidia Shieldのタブレットゲームでは、その電話機に20〜30fpsの安定した60fpsを保持します。 –

関連する問題