【问题标题】:AWT fast graphics & thread safetyAWT 快速图形和线程安全
【发布时间】:2011-09-03 17:37:22
【问题描述】:

我正在将一个非常旧的 AWT 游戏移植到一个非常糟糕的新设备上。

游戏有一大堆问题,包括非常松懈的线程安全方法:游戏引擎试图使用从 UI 线程获得的图形上下文在其引擎线程中直接绘制到屏幕上。这在设备上不起作用。

我已经设法让它正常工作,方法是让引擎线程绘制到屏幕外缓冲区,然后让 UI 线程定期调用显示组件上的 repaint(),然后显示组件将缓冲区传送到屏幕上,但性能很差 --- 考虑到所有上下文切换和双缓冲,这并不奇怪。

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

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

这一切都在 PBP 1.1.2 上 --- 是的,它既不是完整的 Java 也不是诚实的 MidP...

【问题讨论】:

    标签: java graphics 2d awt


    【解决方案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();
    }
    

    【讨论】:

    • 谢谢,但我完全忘了说我正在开发 PBP 1.1.2。所以我没有得到任何有用的东西。 (除非 GameCanvas 可以以某种方式固定到 PBP 系统上?它看起来正是我想要的。)
    • 如果你使用paintImmediately(Graphics guiGraphics) 它也应该可以工作。我举个例子。
    • 我不想这么说,但paintImmediately 是JComponent 上的一种方法,而PBP 没有Swing……是的,只有股票AWT。我告诉过你这很可恨!
    猜你喜欢
    • 2011-04-06
    • 1970-01-01
    • 2021-06-06
    • 2012-01-07
    • 2011-12-02
    • 1970-01-01
    • 2015-11-30
    • 2011-09-19
    相关资源
    最近更新 更多