缓冲策略和缓冲能力

BufferStrategy

在 Java 2 Standard Edition 中,您不必担心视频指针或视频内存就可以充分利用 Double 缓冲或页面翻转功能。添加了新类java\.awt\.image\.BufferStrategy的 Object 是为了方便以通用方式处理针对曲面和零部件的工程图,而与使用的缓冲区数量或显示它们的技术无关。

缓冲策略为您提供了两种通用的绘制方法:getDrawGraphicsshow。当您要开始绘图时,获取绘图图形并使用它。完成绘图并想要在屏幕上显示信息时,请致电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。还要注意,这些方法仅在CanvasWindow上可用。

一旦为组件创建了特定的缓冲策略,就可以使用getBufferStrategy方法对其进行操作。请注意,此方法也仅适用于画布和窗口。

Programming Tips

有关使用缓冲区功能和缓冲区策略的一些技巧:

  • try\.\.\.finally子句中,获取,使用和布置图形对象更加可靠:
BufferStrategy myStrategy;

while (!done) {
    Graphics g;
    try {
        g = myStrategy.getDrawGraphics();
        render(g);
    } finally {
        g.dispose();
    }
    myStrategy.show();
}
  • 在使用缓冲策略之前,请检查可用功能。

  • 为了获得最佳结果,请在全屏独占窗口上创建缓冲策略。使用页面翻转功能之前,请确保检查isFullScreenRequiredisPageFlipping功能。

  • 不要对性能做任何假设。根据需要调整代码,但请记住,不同的 os 和图形卡具有不同的功能。分析您的应用程序!

  • 您可能希望对组件进行子类化以覆盖createBufferStrategy方法。使用算法来选择最适合您的应用程序的策略。 FlipBufferStrategyBltBufferStrategy内部类受保护,可以被子类化。

  • 不要忘记您可能会丢失绘图表面!在绘制之前,请务必检查contentsLostcontentsRestored。恢复时,所有丢失的缓冲区都必须重新绘制。

  • 如果在 Swing 应用程序中使用缓冲策略进行 Double 缓冲,则可能要关闭 Swing 组件的 Double 缓冲,因为它们已经被 Double 缓冲了。视频存储器有些有价值,只应在绝对必要时使用。

  • 使用多个后备缓冲区可能final很浪费。仅当绘图时间超过执行show所花费的时间时,多缓冲才有用。分析您的应用程序!