2011-05-27 48 views
6

我正在将真正老的AWT游戏移植到真正的新设备上。AWT快速图形和线程安全

游戏中有一大堆错误的东西,包括线程安全性非常差的方法:游戏引擎试图使用从UI线程获取的图形上下文直接在引擎线程中绘制屏幕。这在设备上不起作用。

我已经设法通过将引擎线程拖动到屏幕外的缓冲区,然后让UI线程周期性地调用显示组件上的repaint()和将缓冲区分散到屏幕,但性能吮吸---考虑到所有上下文切换和双缓冲,这并不令人惊讶。

我实际上并不是一个非常知名的AWT程序员;到目前为止,我已经避免了它,这足够可恨。但是,这个问题---有一个引擎线程想要在屏幕上绘制---必须是常见的问题。有没有人知道如何以安全的方式做到这一点,以尽可能多地从系统中挤出性能的任何体面的策略(最好是示例代码!)?

(我特别喜欢的是一个安全的快捷方式,允许引擎线程在感觉准备好时直接渲染到屏幕图形上下文,因此避免必须告诉UI线程请求重绘。这将让我拿出整个双层缓冲,但我不知道这样的事情是否可能......)

这是所有PBP 1.1.2 ---是,它不是满的Java也不诚实MidP ...

+0

定期多久? – user314104 2012-05-07 02:32:23

回答

1

使用game canvas可能会有帮助。它允许绘画在游戏循环中完成,所以你不需要双缓冲。另一种更粗糙的方法是使用paintImmediately()。它会迫使gui重画。

//Gui 
public void update(/*may want to pass the shapes to paint*/) 
{ 
    paintImmediately(this.getGrphics()); // assuming 'this' is a jpanel 
} 


//Game loop 
public void gameLoop() 
{ 
    // collision detection etc 
    gui.update(); 
} 
+0

谢谢,但我完全忘记说我正在开发PBP 1.1.2。所以我没有得到任何有用的东西。 (除非GameCanvas可以以某种方式被栓在PBP系统上?它看起来确实是我想要的。) – 2011-05-27 22:30:22

+0

如果使用paintImmediately(Graphics guiGraphics),它也应该可以工作。我会举一个例子。 – Kevin 2011-05-27 22:34:58

+0

我讨厌这么说,但paintImmediately是JComponent上的一个方法,而PBP没有Swing ...是的,仅限于AWT。我告诉过你这很可恶! – 2011-05-27 22:53:40