Каков достаточный способ динамического обновления растрового изображения?

Цели

  • Заставить бар здоровья работать безумно быстрее при обновлении ширины бара.
  • Чтобы сохранить его качество при масштабировании (соотношение пикселей к метру).

В настоящее время я использую libgdx Pixmap создать бар здоровья, но когда я меняю drawLine параметры к новому значению, то вдруг все еще нет никаких изменений. В приведенном ниже коде мой текущий рабочий код, я не уверен, что это достаточный способ рисования Pixmap динамически.

// This code is working when written all in update method

Pixmap frame = new Pixmap(32, 3, Pixmap.Format.RGBA8888);
frame.drawRectangle(...);
frame.drawLine(...);

Texture texture = new Texture(frame);
frame.dispose();

batch.begin();
batch.draw(texture ...);
batch.end();

Образец Healthbar

введите описание изображения здесь

1 ответ

Решение

Вы не должны использовать Pixmap для этого (как общее правило: если вы считаете, что вам нужно использовать Pixmap для чего-то, то вы, вероятно, ошибаетесь). Pixmap используется для загрузки, хранения или управления данными изображения в памяти процессора: RAM. Манипулирование данными изображения в памяти ЦП относительно медленное, и полученные данные нельзя использовать для рендеринга на экране, например, с помощью SpriteBatch,

Для этого вам необходимо загрузить (скопировать) данные из памяти процессора в память GPU: VRAM. Texture используется для представления данных изображения в VRAM. Так что, действительно, вы можете сделать это, создав Texture из этого. В качестве альтернативы вы можете повторно использовать существующую текстуру, вызывая texture.load(pixmap) метод. Однако загрузка данных изображения из ОЗУ в VRAM также происходит относительно медленно.

Таким образом, вместо того, чтобы манипулировать данными изображения на CPU и затем копировать их в GPU, лучше использовать GPU напрямую для достижения того, чего вы хотите. Вы не предоставили достаточно информации о том, чего на самом деле хотите достичь, но вот несколько вариантов, которые могут помочь вам начать работу.

  1. Нарисуйте только часть полного бара. Допустим, у вас есть изображение в вашем атласе, которое представляет полную шкалу здоровья, и вы хотите отобразить только ее часть, представляющую фактическое здоровье: batch.draw(region.getTexture(), x, y, width * health, height, region.getU(), region.getV(), region.getU() + health * (region.getU2() - region.getU()), region.getV2()); (Вот x, y, width а также height расположение и размер бара в ваших мировых координатах и health нормализованное здоровье от 0 до 1).
  2. Масштаб TextureRegion к размеру бара. Допустим, ваша полоса здоровья полностью непрозрачна или только с внешней линией, тогда вы можете использовать один пиксель TextureRegion и масштабируем его до нужного размера: barch.draw(region, x, y, width * health, height);
  3. Используйте девять патчей.
  4. Используйте ShapeRenderer, который обеспечивает практически те же и более функциональные возможности рисования, что и Pixmap делает, но вместо этого делает это напрямую с помощью графического процессора.
Другие вопросы по тегам