2016-11-30 2 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(); 
} 

}

I'am рендеринга около 30 этого на стадии 2d в группе.

Проблема в том, что это может стоить мне около 20 кадров в секунду. Оказание такого же количества простых меток не оказывает заметного влияния на производительность. Я что-то пропустил в этом коде? Эти участники добавляются в группу, которая отображается с использованием Stage.

performance when drawing

performance with draw() content commented

ответ

2

Создавая отдельные объекты текстуры для вашего рабочего стола, вы вызывая SpriteBatch придется смывать дважды, чтобы сделать каждый из ваших HealthBars. SpriteBatch должен очищаться каждый раз, когда получает команду для рисования текстуры, которая не соответствует последней текстуре, представленной для рисования.

(Unrelated, но и это очень расточительно создавать так много копий одного и того же текстуры. - было бы больше смысла, чтобы создать единое белое изображение и есть все бары здоровья использовать)

правильный способ сделать это - поместить сплошное белое изображение в TextureAtlas с остальными вашими изображениями, используемыми в вашем пользовательском интерфейсе, и использовать их в вашем актере. Вы можете позвонить setColor в партии, прежде чем рисовать фон, а затем панель, чтобы область белой текстуры выглядела как любой цвет, который вы хотите. Это значительно уменьшает или устраняет пакетные сбрасывания (за исключением самого последнего, когда вы выполняете этап, рисуя все).

Однако дополнительных 60 партийных флешей обычно не было бы достаточно, чтобы получить такое большое падение частоты кадров, если вы не тестируете телефон с очень низким номером или на эмуляторе Android. Эмулятор Android бесполезен для получения впечатления от фактической производительности на устройстве.

+0

Благодарим за отличную работу! Я старался, чтобы пакетный сбрасывался только тогда, когда я вызываю метод flush(). Он был протестирован на Android-устройстве на нижнем уровне. На планшете Nvidia Shield держится стабильная 60 кадров в секунду, когда на этом телефоне она имеет 20-30 кадров в секунду. –

 Смежные вопросы

  • Нет связанных вопросов^_^