4

我正在研究使用缓冲区策略和 Javadoc 中描述的以下技术:

// Main loop
while (!done) {
 // Prepare for rendering the next frame
 // ...

 // Render single frame
 do {
     // The following loop ensures that the contents of the drawing buffer
     // are consistent in case the underlying surface was recreated
     do {
         // Get a new graphics context every time through the loop
         // to make sure the strategy is validated
         Graphics graphics = strategy.getDrawGraphics();

         // Render to graphics
         // ...

         // Dispose the graphics
         graphics.dispose();

         // Repeat the rendering if the drawing buffer contents 
         // were restored
     } while (strategy.contentsRestored());

     // Display the buffer
     strategy.show();

     // Repeat the rendering if the drawing buffer was lost
 } while (strategy.contentsLost());

}

避免EDTinvokeLater/或invokeAndWait在执行动画时会很棒。

我的问题:

  • 如果这是在 Swing 应用程序中,我们不需要担心将调用show放在 EDT 上吗?
  • 其他人可以在 Swing 应用程序中看到任何问题吗?

这是受到游戏编程这个有趣答案的启发。

4

2 回答 2

3

一般来说,没有。在除事件分派线程 (EDT)之外的线程上进行绘制会导致不需要的工件,尽管结果可能是可以接受的。这个例子展示了一些权衡。我更喜欢安排使用javax.swing.Timer在 EDT 上绘制,但其他方法也是可能的。此外,您选择的顶级Container可能已经实现了Buffer Strategy

于 2009-12-27T20:27:55.467 回答
2

正如垃圾狗所提到的,这样做并不是一个好主意。创建自己的动画线程,将绘制离屏图像。然后将其推到某个支架上。如果调用paintComponent 获取当前图像并将其绘制在组件上。完毕。看会合模式。

于 2010-01-02T19:40:13.460 回答