什么是动态更新像素图的充分方法?

时间:2016-08-11 15:59:01

标签: java libgdx pixmap

目标

  • 在更新条形宽度时,使健康栏更快地执行。
  • 在缩放时保持其质量(像素与米的比例)。

目前我正在使用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();

示例健康栏

enter image description here

1 个答案:

答案 0 :(得分:4)

你不应该使用Pixmap(根据一般的经验法则:如果你认为你需要使用Pixmap,那么你可能错了)。 Pixmap用于加载,存储或操作CPU内存中的图像数据:RAM。操纵CPU存储器中的图像数据相对较慢,并且所得到的数据不能用于在屏幕上用例如数据进行渲染。 SpriteBatch

为此,您需要将数据从CPU内存上传(复制)到GPU内存:VRAM。 Texture用于表示VRAM中的图像数据。所以,实际上,你可以通过创建一个Texture来做到这一点。或者,您可以通过调用texture.load(pixmap)方法重用现有纹理。但是,将图像数据从RAM上传到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,{{ 1}},ywidth是世界坐标中条形的位置和大小,height是从0到1的标准化健康状况。
  2. health缩放到条形图的大小。假设您的健康栏完全不透明或只有外线,那么您可以使用单个像素TextureRegion并将其缩放到您想要的尺寸:TextureRegion
  3. 使用nine-patch
  4. 使用ShapeRenderer,它提供与barch.draw(region, x, y, width * health, height);实际上相同和更多的绘图功能,但直接使用GPU。
相关问题