Каков достаточный способ динамического обновления растрового изображения?
Цели
- Заставить бар здоровья работать безумно быстрее при обновлении ширины бара.
- Чтобы сохранить его качество при масштабировании (соотношение пикселей к метру).
В настоящее время я использую 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 напрямую для достижения того, чего вы хотите. Вы не предоставили достаточно информации о том, чего на самом деле хотите достичь, но вот несколько вариантов, которые могут помочь вам начать работу.
- Нарисуйте только часть полного бара. Допустим, у вас есть изображение в вашем атласе, которое представляет полную шкалу здоровья, и вы хотите отобразить только ее часть, представляющую фактическое здоровье:
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). - Масштаб
TextureRegion
к размеру бара. Допустим, ваша полоса здоровья полностью непрозрачна или только с внешней линией, тогда вы можете использовать один пиксельTextureRegion
и масштабируем его до нужного размера:barch.draw(region, x, y, width * health, height);
- Используйте девять патчей.
- Используйте ShapeRenderer, который обеспечивает практически те же и более функциональные возможности рисования, что и
Pixmap
делает, но вместо этого делает это напрямую с помощью графического процессора.