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

ron*_*ipt 0 java pixmap libgdx

目标

  • 在更新条宽的同时使健康条的执行速度更快。
  • 在缩放时保持其质量(像素与米的比率)。

目前我正在使用 libgdxPixmap创建一个健康栏,但是当我将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();
Run Code Online (Sandbox Code Playgroud)

样本健康条

在此处输入图片说明

Xop*_*ppa 5

你不应该使用Pixmap它(作为一般经验法则:如果你认为你需要使用 Pixmap 来做某事,那么你可能错了)。APixmap用于加载、存储或操作 CPU 内存中的图像数据:RAM。在 CPU 内存中操作图像数据相对较慢,并且生成的数据不能用于在屏幕上呈现,例如SpriteBatch.

为此,您需要将数据从 CPU 内存上传(复制)到 GPU 内存:VRAM。ATexture用于表示 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());(这里xywidthheight在你的世界坐标栏的位置及大小,health是归一化的健康状况,范围从 0 到 1)。
  2. 将 a 缩放TextureRegion到条形的大小。假设您的健康栏完全不透明或只有外线,那么您可以使用单个像素TextureRegion并将其缩放为您想要的大小:barch.draw(region, x, y, width * health, height);
  3. 使用九补丁
  4. 使用ShapeRenderer,它提供几乎相同且更多的绘图功能Pixmap,但直接使用 GPU 来完成。