0

目标

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

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

样本健康栏

在此处输入图像描述

4

1 回答 1

5

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

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