AWT快速图形和线程安全

7
我正在将一个非常古老的AWT游戏移植到一个非常糟糕的新设备上。该游戏有很多问题,包括对线程安全性的非常宽松的处理方式:游戏引擎试图在其引擎线程中直接在屏幕上绘制,使用从UI线程获得的图形上下文。这在该设备上无法工作。我已经设法使其正常工作,通过让引擎线程绘制到离屏缓冲区,然后让UI线程定期调用显示组件的repaint()方法,并将缓冲区复制到屏幕上,但性能很差——鉴于所有上下文切换和双缓冲,这并不奇怪。我实际上并不是一个特别了解AWT编程的程序员;它非常可恶,以至于我一直避免它。但是这个问题——引擎线程想要在屏幕上绘制——必须是一个常见的问题。有没有人知道如何以尽可能安全的方式进行此操作的好策略(最好附带示例代码!),并从系统中挤出尽可能多的性能?我特别想要的是一个安全的快捷方式,允许引擎线程在准备好时直接渲染到屏幕图形上下文中,从而避免告诉UI线程请求重绘。这将让我去掉整个双缓冲层。但我不知道是否可能做到这一点……这全部都是在PBP 1.1.2上完成的——是的,它既不是完整的Java也不是诚实的MidP……
1个回答

1

使用游戏画布可能会有所帮助。它允许在游戏循环中进行绘制,因此您不需要双缓冲。另一种更粗糙的方法是使用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();
}

谢谢,但我完全忘记说我正在使用PBP 1.1.2。所以我得不到任何有用的东西。(除非GameCanvas可以某种方式附加到PBP系统上?它看起来确实是我想要的。) - David Given
如果您使用paintImmediately(Graphics guiGraphics),它也应该可以工作。我会提供一个例子。 - Kevin
我很不情愿地说,paintImmediately是JComponent上的一个方法,而PBP没有Swing... 是的,只有标准的AWT。我告诉过你这很可恶! - David Given

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接