目标
目前我正在使用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();
示例健康栏
答案 0 :(得分:4)
你不应该使用Pixmap
(根据一般的经验法则:如果你认为你需要使用Pixmap,那么你可能错了)。 Pixmap
用于加载,存储或操作CPU内存中的图像数据:RAM。操纵CPU存储器中的图像数据相对较慢,并且所得到的数据不能用于在屏幕上用例如数据进行渲染。 SpriteBatch
。
为此,您需要将数据从CPU内存上传(复制)到GPU内存:VRAM。 Texture
用于表示VRAM中的图像数据。所以,实际上,你可以通过创建一个Texture
来做到这一点。或者,您可以通过调用texture.load(pixmap)
方法重用现有纹理。但是,将图像数据从RAM上传到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
,{{ 1}},y
和width
是世界坐标中条形的位置和大小,height
是从0到1的标准化健康状况。health
缩放到条形图的大小。假设您的健康栏完全不透明或只有外线,那么您可以使用单个像素TextureRegion
并将其缩放到您想要的尺寸:TextureRegion
barch.draw(region, x, y, width * health, height);
实际上相同和更多的绘图功能,但直接使用GPU。