缓冲策略和缓冲能力
BufferStrategy
在 Java 2 Standard Edition 中,您不必担心视频指针或视频内存就可以充分利用 Double 缓冲或页面翻转功能。添加了新类java\.awt\.image\.BufferStrategy
的 Object 是为了方便以通用方式处理针对曲面和零部件的工程图,而与使用的缓冲区数量或显示它们的技术无关。
缓冲策略为您提供了两种通用的绘制方法:getDrawGraphics
和show
。当您要开始绘图时,获取绘图图形并使用它。完成绘图并想要在屏幕上显示信息时,请致电show
。设计这两种方法时,它们很合适地适合渲染循环:
BufferStrategy myStrategy;
while (!done) {
Graphics g = myStrategy.getDrawGraphics();
render(g);
g.dispose();
myStrategy.show();
}
还设置了缓冲策略来帮助您监视VolatileImage
问题。在全屏独占 Pattern 下,VolatileImage
问题尤其重要,因为窗口系统有时可以取回它给您的视频内存。一个重要的例子是,当用户在 Windows 中按下ALT+TAB
组合键时,突然您的全屏程序在后台运行,并且视频内存丢失。您可以调用contentsLost
方法来确定是否发生了这种情况。同样,当窗口系统将内存返回给您时,您可以使用contentsRestored
方法进行查找。
BufferCapabilities
如前所述,不同的 os,甚至同一 os 上的不同图形卡,都可以使用不同的技术。向您公开了这些功能,以便您可以为应用程序选择最佳技术。
java\.awt\.BufferCapabilities
类封装了这些功能。每个缓冲策略都由其缓冲功能控制,因此为您的应用程序选择正确的策略非常关键。要找出可用的功能,请从图形设备上可用的GraphicsConfiguration
对象中调用getBufferCapabilities
方法。
Java 2 Standard Edition 1.4 版提供的功能是:
-
isPageFlipping
此功能返回此图形配置上是否提供硬件页面翻转功能。 -
isFullScreenRequired
此功能返回在try进行硬件页面翻转之前是否需要全屏独占 Pattern。 -
isMultiBufferAvailable
此功能返回硬件中是否有多个缓冲(两个或更多个后备缓冲区加上主表面)。 -
getFlipContents
此功能返回了用于进行硬件页面翻转的技术的提示。这很重要,因为根据所使用的技术,show
之后的后缓冲区的内容是不同的。返回的值可以为 null(如果isPageFlipping
返回false
)或以下值之一。只要isPageFlipping
方法返回 true,就可以为缓冲区策略指定任何值,尽管性能会因可用功能而异。 -
FlipContents.COPIED
该值意味着将后缓冲区的内容复制到主表面。 “翻转”可能是作为硬件 blt 执行的,这意味着硬件 Double 缓冲可能是使用 blitting 而不是 true 的页面翻转来完成的。从理论上讲,这应该更快,或者至少与从VolatileImage
向主表面发短信一样快,尽管里程可能会有所不同。翻转后,后缓冲区的内容与主表面相同。 -
FlipContents.BACKGROUND
该值表示后台缓冲区的内容已用背景色清除。发生了 true 的页面翻转或 blt。 -
FlipContents.PRIOR
此值意味着后缓冲区的内容现在是旧主曲面的内容,反之亦然。通常,此值表示发生了 true 的页面翻转,尽管不能保证,并且再次执行此操作时可能会有所不同。 -
FlipContents.UNKNOWN
该值表示翻转后未定义后缓冲区的内容。您可能需要try找出最适合您的技术(或者您可能不在乎),并且每次绘制时都必须自己设置后缓冲区的内容。
要为组件创建缓冲策略,请调用createBufferStrategy
方法,并提供所需的缓冲数量(此数量包括主表面)。如果需要任何特定的缓冲技术,请提供适当的BufferCapabilities
对象。请注意,使用此版本的方法时,如果选择不可用,则必须catchAWTException
。还要注意,这些方法仅在Canvas
和Window
上可用。
一旦为组件创建了特定的缓冲策略,就可以使用getBufferStrategy
方法对其进行操作。请注意,此方法也仅适用于画布和窗口。
Programming Tips
有关使用缓冲区功能和缓冲区策略的一些技巧:
- 在
try\.\.\.finally
子句中,获取,使用和布置图形对象更加可靠:
BufferStrategy myStrategy;
while (!done) {
Graphics g;
try {
g = myStrategy.getDrawGraphics();
render(g);
} finally {
g.dispose();
}
myStrategy.show();
}
-
在使用缓冲策略之前,请检查可用功能。
-
为了获得最佳结果,请在全屏独占窗口上创建缓冲策略。使用页面翻转功能之前,请确保检查
isFullScreenRequired
和isPageFlipping
功能。 -
不要对性能做任何假设。根据需要调整代码,但请记住,不同的 os 和图形卡具有不同的功能。分析您的应用程序!
-
您可能希望对组件进行子类化以覆盖
createBufferStrategy
方法。使用算法来选择最适合您的应用程序的策略。FlipBufferStrategy
和BltBufferStrategy
内部类受保护,可以被子类化。 -
不要忘记您可能会丢失绘图表面!在绘制之前,请务必检查
contentsLost
和contentsRestored
。恢复时,所有丢失的缓冲区都必须重新绘制。 -
如果在 Swing 应用程序中使用缓冲策略进行 Double 缓冲,则可能要关闭 Swing 组件的 Double 缓冲,因为它们已经被 Double 缓冲了。视频存储器有些有价值,只应在绝对必要时使用。
-
使用多个后备缓冲区可能final很浪费。仅当绘图时间超过执行
show
所花费的时间时,多缓冲才有用。分析您的应用程序!