Module java.desktop
Package java.awt.image

Class BufferStrategy

java.lang.Object
java.awt.image.BufferStrategy
直接已知的子类:
Component.BltBufferStrategy, Component.FlipBufferStrategy

public abstract class BufferStrategy extends Object
BufferStrategy类表示用于在特定CanvasWindow上组织复杂内存的机制。硬件和软件限制确定了特定缓冲策略是否以及如何实现。这些限制可通过创建CanvasWindow时使用的GraphicsConfiguration的功能来检测。

值得注意的是,术语缓冲区表面是同义词:一个连续内存区域,可以是视频设备内存或系统内存中的区域。

有几种复杂的缓冲策略,包括顺序环形缓冲和位块缓冲。顺序环形缓冲(即双缓冲或三重缓冲)是最常见的;应用程序绘制到单个后备缓冲区,然后通过复制数据或移动视频指针的单个步骤将内容移动到前端(显示),移动视频指针会交换缓冲区,使得第一个绘制的缓冲区成为前端缓冲区,或者当前在设备上显示的内容;这称为翻页

另外,后备缓冲区的内容可以被复制,或者以链式方式向前位块,而不是移动视频指针。


 双缓冲:

                    ***********         ***********
                    *         * ------> *         *
 [显示] <---- * 前端缓冲区 *   显示  * 后备缓冲区 * <---- 渲染
                    *         * <------ *         *
                    ***********         ***********

 三重缓冲:

 [显示] ***********         ***********        ***********
    <---- *         * --------+---------+------> *         *
          * 前端缓冲区 *   显示  * 中间缓冲区 *        * 后备缓冲区 * <---- 渲染
          *         * <------ *         * <----- *         *
          ***********         ***********        ***********

 

以下是如何创建和使用缓冲策略的示例:



 // 检查GraphicsConfiguration的功能
 ...

 // 创建我们的组件
 Window w = new Window(gc);

 // 显示我们的窗口
 w.setVisible(true);

 // 创建一个通用的双缓冲策略
 w.createBufferStrategy(2);
 BufferStrategy strategy = w.getBufferStrategy();

 // 主循环
 while (!done) {
     // 准备渲染下一帧
     // ...

     // 渲染单帧
     do {
         // 以下循环确保绘图缓冲区的内容在基础表面重新创建时保持一致
         do {
             // 每次循环都获取一个新的图形上下文
             // 以确保验证策略
             Graphics graphics = strategy.getDrawGraphics();

             // 渲染到图形上下文
             // ...

             // 释放图形
             graphics.dispose();

             // 如果绘图缓冲区内容已恢复,则重复渲染
         } while (strategy.contentsRestored());

         // 显示缓冲区
         strategy.show();

         // 如果绘图缓冲区丢失,则重复渲染
     } while (strategy.contentsLost());
 }

 // 释放窗口
 w.setVisible(false);
 w.dispose();
 
自1.4版本起:
1.4
参见:
  • Constructor Summary

    Constructors
    Modifier
    Constructor
    Description
    protected
    子类调用的构造函数。
  • Method Summary

    Modifier and Type
    Method
    Description
    abstract boolean
    返回自上次调用getDrawGraphics以来绘图缓冲区是否丢失。
    abstract boolean
    返回自上次调用getDrawGraphics以来绘图缓冲区是否最近从丢失状态恢复并重新初始化为默认背景颜色(白色)。
    void
    释放当前由此BufferStrategy消耗的系统资源,并将其从关联的组件中移除。
    返回此BufferStrategyBufferCapabilities
    abstract Graphics
    为绘图缓冲区创建图形上下文。
    abstract void
    show()
    通过复制内存(位块)或更改显示指针(翻转)使下一个可用缓冲区可见。

    Methods declared in class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • BufferStrategy

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

    • getCapabilities

      public abstract BufferCapabilities getCapabilities()
      返回此BufferStrategyBufferCapabilities
      返回:
      此策略的缓冲能力
    • getDrawGraphics

      public abstract Graphics getDrawGraphics()
      为绘图缓冲区创建图形上下文。出于性能原因,此方法可能不是同步的;多个线程使用此方法应在应用程序级别处理。必须由应用程序处理获取的图形对象的处理。
      返回:
      绘图缓冲区的图形上下文
    • contentsLost

      public abstract boolean contentsLost()
      返回自上次调用getDrawGraphics以来绘图缓冲区是否丢失。由于缓冲策略中的缓冲区通常是类型VolatileImage,它们可能会丢失。有关丢失缓冲区的讨论,请参阅VolatileImage
      返回:
      绘图缓冲区自上次调用getDrawGraphics以来是否丢失。
      参见:
    • contentsRestored

      public abstract boolean contentsRestored()
      返回自上次调用getDrawGraphics以来绘图缓冲区是否最近从丢失状态恢复并重新初始化为默认背景颜色(白色)。由于缓冲策略中的缓冲区通常是类型VolatileImage,它们可能会丢失。如果表面自上次调用getDrawGraphics以来最近从丢失状态恢复,则可能需要重新绘制。有关丢失缓冲区的讨论,请参阅VolatileImage
      返回:
      绘图缓冲区自上次调用getDrawGraphics以来是否已恢复。
      参见:
    • show

      public abstract void show()
      通过复制内存(位块)或更改显示指针(翻转)使下一个可用缓冲区可见。
    • dispose

      public void dispose()
      释放当前由此BufferStrategy消耗的系统资源,并将其从关联的组件中移除。调用此方法后,getBufferStrategy将返回null。在释放后尝试使用BufferStrategy将导致未定义的行为。
      自1.6版本起:
      1.6
      参见: