java.lang.Object
java.awt.image.BufferStrategy
BufferStrategy
类表示用于在特定Canvas
或Window
上组织复杂内存的机制。硬件和软件限制确定了特定缓冲策略是否以及如何实现。这些限制可通过创建Canvas
或Window
时使用的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
-
Method Summary
Modifier and TypeMethodDescriptionabstract boolean
返回自上次调用getDrawGraphics
以来绘图缓冲区是否丢失。abstract boolean
返回自上次调用getDrawGraphics
以来绘图缓冲区是否最近从丢失状态恢复并重新初始化为默认背景颜色(白色)。void
dispose()
释放当前由此BufferStrategy
消耗的系统资源,并将其从关联的组件中移除。abstract BufferCapabilities
返回此BufferStrategy
的BufferCapabilities
。abstract Graphics
为绘图缓冲区创建图形上下文。abstract void
show()
通过复制内存(位块)或更改显示指针(翻转)使下一个可用缓冲区可见。
-
Constructor Details
-
BufferStrategy
protected BufferStrategy()子类调用的构造函数。
-
-
Method Details
-
getCapabilities
返回此BufferStrategy
的BufferCapabilities
。- 返回:
- 此策略的缓冲能力
-
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
- 参见:
-