被动渲染与主动渲染

如前所述,大多数全屏应用程序通常在绘制过程中发挥更好的作用。在传统的窗口式 GUI 应用程序中,何时绘制问题通常由 os 处理。在窗口环境中操作时,这是很有意义的。窗口化的应用程序不知道用户何时会移动,调整大小,暴露或覆盖另一个窗口,直到它 true 发生为止。在 Java GUI 应用程序中,os 将绘画事件传递给 AWT,该事件确定需要绘画的内容,创建具有适当剪切区域的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
}

有时将其称为被动渲染。可以想象,这样的系统会产生很多开销,这使许多对性能敏感的 AWT 和 Swing 程序员感到烦恼。

在全屏独占 Pattern 下,您不必担心窗口会被调整大小,移动,暴露或遮挡(除非您忽略了我关闭调整大小的建议)。而是将应用程序窗口直接绘制到屏幕上(活动渲染)。因为您不必担心绘画事件,所以这大大简化了绘画。实际上,在全屏排他 Pattern 下,由 os 传递的绘画事件甚至可能在不适当或不可预测的时间传递。

通常,在渲染循环中更适当地完成绘制代码,而不是在全屏独占 Pattern 下依赖paint方法:

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

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

Programming Tips

有关使用主动渲染的一些技巧:

首页