Java 动态更新pixmap的充分方法是什么?

Java 动态更新pixmap的充分方法是什么?,java,libgdx,pixmap,Java,Libgdx,Pixmap,目标 使健康栏在更新栏宽时执行速度快得惊人 在缩放时保持其质量(像素/米比率) 目前我正在使用libgdxPixmap创建健康条,但是当我将drawLine参数更改为新值时,突然仍然没有任何更改。下面的代码是我当前的工作代码,我不确定这是否是动态绘制Pixmap的充分方法 // This code is working when written all in update method Pixmap frame = new Pixmap(32, 3, Pixmap.Format.RGBA8

目标

  • 使健康栏在更新栏宽时执行速度快得惊人
  • 在缩放时保持其质量(像素/米比率)
目前我正在使用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();
健康酒吧样品


你不应该为此而使用
Pixmap
(一般的经验法则是:如果你认为你需要使用Pixmap,那么你很可能是错的)。
Pixmap
用于加载、存储或操作CPU内存:RAM中的图像数据。在CPU内存中操作图像数据的速度相对较慢,并且生成的数据不能用于在屏幕上渲染,例如使用
SpriteBatch

为此,您需要将数据从CPU内存上传(复制)到GPU内存:VRAM。
纹理
用于表示VRAM中的图像数据。因此,实际上,您可以通过创建一个
纹理来实现这一点。或者,您可以通过调用
texture.load(pixmap)
方法重用现有纹理。然而,将图像数据从RAM上传到VRAM的速度也相对较慢

因此,与其在CPU上操作图像数据,然后将其复制到GPU,不如直接使用GPU来实现您想要的。您没有提供足够的信息来说明您真正想要实现的目标,但是这里有一些选项可以帮助您开始

  • 仅绘制完整条的一部分。假设您的图集中有一个表示完整健康状态栏的图像,您只想渲染其中的一部分,表示实际健康状态:
    batch.draw(region.getexture(),x,y,width*health,region.getU(),region.getV(),region.getU()+health*(region.getU2()-region.getU()),region.getV2())
    (此处
    x
    y
    宽度
    高度
    是条形图在世界坐标中的位置和大小,
    健康状况
    是从0到1的标准化健康状况)
  • 纹理区域
    缩放到条的大小。假设你的健康栏是完全不透明的,或者只有一条外线,那么你可以使用一个像素
    TextureRegion
    并将其缩放为你想要的大小:
    barch.draw(区域,x,y,宽度*健康,高度)
  • 使用一个
  • 使用,它提供了与
    Pixmap
    几乎相同且更多的绘图功能,但它直接使用GPU

  • 您不应该为此使用
    Pixmap
    (一般的经验法则是:如果您认为需要使用Pixmap,那么您可能是错的)。
    Pixmap
    用于加载、存储或操作CPU内存:RAM中的图像数据。在CPU内存中操作图像数据的速度相对较慢,并且生成的数据不能用于在屏幕上渲染,例如使用
    SpriteBatch

    为此,您需要将数据从CPU内存上传(复制)到GPU内存:VRAM。
    纹理
    用于表示VRAM中的图像数据。因此,实际上,您可以通过创建一个
    纹理来实现这一点。或者,您可以通过调用
    texture.load(pixmap)
    方法重用现有纹理。然而,将图像数据从RAM上传到VRAM的速度也相对较慢

    因此,与其在CPU上操作图像数据,然后将其复制到GPU,不如直接使用GPU来实现您想要的。您没有提供足够的信息来说明您真正想要实现的目标,但是这里有一些选项可以帮助您开始

  • 仅绘制完整条的一部分。假设您的图集中有一个表示完整健康状态栏的图像,您只想渲染其中的一部分,表示实际健康状态:
    batch.draw(region.getexture(),x,y,width*health,region.getU(),region.getV(),region.getU()+health*(region.getU2()-region.getU()),region.getV2())
    (此处
    x
    y
    宽度
    高度
    是条形图在世界坐标中的位置和大小,
    健康状况
    是从0到1的标准化健康状况)
  • 纹理区域
    缩放到条的大小。假设你的健康栏是完全不透明的,或者只有一条外线,那么你可以使用一个像素
    TextureRegion
    并将其缩放为你想要的大小:
    barch.draw(区域,x,y,宽度*健康,高度)
  • 使用一个
  • 使用,它提供了与
    Pixmap
    几乎相同且更多的绘图功能,但它直接使用GPU

  • 您是否在render()中调用了所有这些函数?是的,当我调用所有函数时,它们都正常工作,但是有没有办法不调用所有函数?首先,您不需要为此实际创建pixmap。第二,也许你可以在课堂上创建pixmap字段,但我只是想了解你是否这样做:)顺便问一下,你在绘制直线和矩形时是否在更改pixmap颜色。我在绘制其纹理时正在更改线宽。你可以通过pixmap.setColor(…)更改pixmap颜色吗在绘制矩形和直线之间。当然,在绘制直线后将颜色更改为back。您的代码看起来很好。同时查看line和rectangle的参数会更好。您是否在render()中调用了所有参数?是的,当我调用所有参数时,它们工作正常,但有没有办法不调用所有参数?首先,您不需要为此实际创建pixmap。第二,也许你可以在课堂上创建pixmap字段,但我只是想知道你是否这样做:)顺便问一下,你在画直线和矩形时是否在改变pixmap的颜色