文档

Java™ 教程-Java Tutorials 中文版
被动与主动渲染
Trail: Bonus
Lesson: Full-Screen Exclusive Mode API

被动与主动渲染

如前所述,大多数全屏应用程序通常在绘图过程中掌控时效果更好。在传统的窗口 GUI 应用程序中,何时绘制的问题通常由操作系统处理。在窗口环境中操作时,这非常有意义。窗口化应用程序不知道用户何时将其他窗口移动,调整大小,公开或覆盖应用程序,直到实际发生。在 Java GUI 应用程序中,操作系统向 AWT 提供 paint event (绘制事件),其中指出需要绘制的内容,创建一个 java.awt.Graphics 对象。适当的剪切区域,然后使用 Graphics 对象调用 paint 方法:

// Traditional GUI Application paint method:
// This can be called at any time, usually 
// from the event dispatch thread
public void paint(Graphics g) {
    // Use g to draw my Component
}

这有时被称为 passive rendering (被动渲染)。可以想象,这样的系统会产生很多开销,这对很多对性能敏感的 AWT 和 Swing 程序员来说都很烦人。

在全屏独占模式下,你不必再担心窗口被调整大小,移动,暴露或遮挡(除非你忽略了我关闭调整大小的建议)。而是将应用程序窗口直接绘制到屏幕上(active rendering (主动渲染))。这简化了绘画,因为你不需要担心绘画事件。实际上,当处于全屏独占模式时,操作系统提供的绘制事件甚至可能在不适当或不可预测的时间传递。

在全屏独占模式下,绘图代码通常更适合在 rendering loop (渲染循环) 中完成,而不是依赖于 paint 方法:

public void myRenderingLoop() {
    while (!done) {
        Graphics myGraphics = getPaintGraphics();
        // Draw as appropriate using myGraphics
        myGraphics.dispose();
    }
}

这样的渲染循环可以从任何线程完成,可以是自己的辅助线程,也可以是主应用程序线程的一部分。

编程提示

有关使用主动渲染的一些提示:


Previous page: Display Mode
Next page: Double Buffering and Page Flipping