Module java.desktop
Package java.awt.image

Class VolatileImage

java.lang.Object
java.awt.Image
java.awt.image.VolatileImage
所有已实现的接口:
透明性

public abstract class VolatileImage extends Image implements Transparency
VolatileImage是一种图像,由于应用程序无法控制的情况(例如操作系统或其他应用程序引起的情况),其内容可能随时丢失。由于可能存在硬件加速的潜力,VolatileImage对象在某些平台上可能具有显着的性能优势。

图像的绘制表面(实际存储图像内容的内存)可能会丢失或无效,导致该内存的内容消失。因此,需要恢复或重新创建绘图表面,并重新呈现该表面的内容。VolatileImage提供了一个接口,允许用户在发生这些问题时检测并修复它们。

创建VolatileImage对象时,可能会分配有限的系统资源,例如视频内存(VRAM)以支持图像。当不再使用VolatileImage对象时,它可能会被垃圾回收,并且这些系统资源将被释放,但这个过程不会在保证的时间发生。创建许多VolatileImage对象的应用程序(例如,调整大小的窗口可能会在大小更改时强制重新创建其后备缓冲区)可能会耗尽新VolatileImage对象的最佳系统资源,仅仅因为旧对象尚未从系统中删除。 (仍然可以创建新的VolatileImage对象,但它们可能不像在加速内存中创建的那样表现良好)。可以随时调用flush方法主动释放VolatileImage使用的资源,以便它不会阻止后续VolatileImage对象被加速。通过这种方式,应用程序可以更好地控制被过时的VolatileImage对象占用的资源状态。

不应直接对此图像进行子类化,而应使用Component.createVolatileImageGraphicsConfiguration.createCompatibleVolatileImage(int, int)方法来创建它。

以下是使用VolatileImage对象的示例:

 // 创建图像
 VolatileImage vImg = createVolatileImage(w, h);


 // 渲染到图像
 void renderOffscreen() {
      do {
          if (vImg.validate(getGraphicsConfiguration()) ==
              VolatileImage.IMAGE_INCOMPATIBLE)
          {
              // 旧vImg与新GraphicsConfig不兼容;重新创建它
              vImg = createVolatileImage(w, h);
          }
          Graphics2D g = vImg.createGraphics();
          //
          // 其他渲染命令...
          //
          g.dispose();
      } while (vImg.contentsLost());
 }


 // 从图像复制(这里,gScreen是用于屏幕窗口的Graphics对象)
 do {
      int returnCode = vImg.validate(getGraphicsConfiguration());
      if (returnCode == VolatileImage.IMAGE_RESTORED) {
          // 需要恢复内容
          renderOffscreen();      // 恢复内容
      } else if (returnCode == VolatileImage.IMAGE_INCOMPATIBLE) {
          // 旧vImg与新GraphicsConfig不兼容;重新创建它
          vImg = createVolatileImage(w, h);
          renderOffscreen();
      }
      gScreen.drawImage(vImg, 0, 0, this);
 } while (vImg.contentsLost());
 

请注意,此类从Image类继承,该类包括采用ImageObserver参数进行异步通知的方法,因为从潜在ImageProducer接收到信息时。由于此VolatileImage不是从异步源加载的,因此采用采用ImageObserver参数的各种方法将表现为数据已经从ImageProducer获取。具体来说,这意味着这些方法的返回值永远不会指示信息尚不可用,并且在这些方法中使用的ImageObserver永远不需要记录用于异步回调通知。

自1.4版本起:
1.4
  • Field Details

  • Constructor Details

    • VolatileImage

      protected VolatileImage()
      子类调用的构造函数。
  • Method Details

    • getSnapshot

      public abstract BufferedImage getSnapshot()
      返回此对象的静态快照图像。返回的BufferedImage仅在请求时与VolatileImage当前状态一致,并不会随着VolatileImage的未来更改而更新。
      返回:
      VolatileImageBufferedImage表示
      参见:
    • getWidth

      public abstract int getWidth()
      返回VolatileImage的宽度。
      返回:
      VolatileImage的宽度。
    • getHeight

      public abstract int getHeight()
      返回VolatileImage的高度。
      返回:
      VolatileImage的高度。
    • getSource

      public ImageProducer getSource()
      为此VolatileImage返回一个ImageProducer。请注意,VolatileImage对象针对渲染操作和将图像传输到屏幕或其他VolatileImage对象进行了优化,而不是读取图像的像素。因此,像getSource这样的操作可能不像不依赖于读取像素的操作那样快。还要注意,从图像读取的像素值仅在检索时与图像中的像素一致。此方法在请求时获取图像的快照,并且返回的ImageProducer对象与该静态快照图像一起工作,而不是原始VolatileImage。调用getSource()等同于调用getSnapshot().getSource()。
      指定者:
      getSource 在类 Image
      返回:
      一个ImageProducer,可用于生成BufferedImage表示的像素
      参见:
    • getGraphics

      public Graphics getGraphics()
      此方法返回一个Graphics2D,但这里是为了向后兼容性。createGraphics更方便,因为它声明为返回Graphics2D
      指定者:
      getGraphics 在类 Image
      返回:
      一个Graphics2D,可用于绘制到此图像中。
      参见:
    • createGraphics

      public abstract Graphics2D createGraphics()
      创建一个Graphics2D,可用于绘制到此VolatileImage中。
      返回:
      一个用于绘制到此图像中的Graphics2D
    • validate

      public abstract int validate(GraphicsConfiguration gc)
      尝试恢复图像的绘图表面,如果自上次validate调用以来表面已丢失。还根据给定的GraphicsConfiguration参数验证此图像,以查看从此图像到GraphicsConfiguration的操作是否兼容。不兼容组合的一个例子可能是这样一种情况:VolatileImage对象在一个图形设备上创建,然后用于在不同的图形设备上渲染。由于VolatileImage对象往往是非常特定于设备的,因此此操作可能无法按预期工作,因此此validate调用的返回代码将指出不兼容性。对于gc的空值或不正确值可能导致从validate返回不正确的值,并可能导致后续渲染出现问题。
      参数:
      gc - 用于验证此图像的GraphicsConfiguration对象。空的gc意味着validate方法应跳过兼容性测试。
      返回:
      IMAGE_OK 如果图像不需要验证
      IMAGE_RESTORED 如果图像需要恢复。恢复意味着图像的内容可能受到影响,可能需要重新渲染图像。
      IMAGE_INCOMPATIBLE 如果图像与传入validate方法的GraphicsConfiguration对象不兼容。不兼容意味着可能需要使用新的ComponentGraphicsConfiguration重新创建图像,以便获得可以成功与此GraphicsConfiguration一起使用的图像。不兼容图像不会检查是否需要恢复,因此在返回值为IMAGE_INCOMPATIBLE后图像的状态保持不变,此返回值不意味着图像是否需要恢复。
      参见:
    • contentsLost

      public abstract boolean contentsLost()
      如果自上次validate调用以来丢失了渲染数据,则返回true。应用程序应在任何渲染操作序列结束时调用此方法,以查看是否需要验证图像并重新进行渲染。
      返回:
      如果需要恢复绘图表面,则返回true;否则返回false
    • getCapabilities

      public abstract ImageCapabilities getCapabilities()
      返回一个ImageCapabilities对象,可以查询此VolatileImage的特定能力。这将允许程序员获取有关他们创建的特定VolatileImage对象的更多运行时信息。例如,用户可能创建了一个VolatileImage,但系统可能没有足够的视频内存来创建那个大小的图像,因此尽管对象是VolatileImage,但它不像此平台上的其他VolatileImage对象那样加速。用户可能需要这些信息来找到解决问题的其他方案。
      返回:
      包含此VolatileImage能力的ImageCapabilities对象。
      自:
      1.4
    • getTransparency

      public int getTransparency()
      返回透明度。返回OPAQUE、BITMASK或TRANSLUCENT中的一个。
      指定者:
      getTransparency 在接口 Transparency
      返回:
      VolatileImage的透明度。
      自:
      1.5
      参见: