【问题标题】:Adjusting repaints in JComponent to improve performance调整 JComponent 中的重绘以提高性能
【发布时间】:2012-10-17 00:38:52
【问题描述】:

我正在尝试对 2D“游戏”编程进行一些测试,尝试不同的概念来处理环境的设计和可视化。

在我的小步骤中,我开始使用 Swing 并使用 JComponent 的 paintComponent() 方法来检索 Graphics2D 对象,然后我用它来可视化我的游戏板。

它工作得很好,但我需要反复检查我的整个游戏模型并更新视图,基本上每 1/10 秒一次,有些东西会发生变化。

我通过在我的 JComponent 上调用 repaint() 来绘制视觉效果以导致视图的完整更新:我检查我的游戏板上的每个图块以获取信息,并根据此数据为板上的每个图块绘制该图块。但是当我接近需要绘制大约 1000 到 4000 个图块时,我会发现整个视图的绘制需要超过 100 毫秒,因此在执行任何操作时都会出现持续的延迟。

现在的问题是:我正在寻找关于如何提高这种方法的性能的方法或意见。由于并非板上的每个图块都会更改每个“滴答”,因此我不需要“重新绘制”该图块。但相反,移动可视区域(相机偏移)会改变屏幕上每个图块的位置,因此需要在不同的位置重新绘制。此外,“将是”动画的后期实现将需要不断更新视觉区域,无论“发生”与否。在查看运行速度超过 30 FPS 的高质量图形(甚至像 minecraft 之类的简单游戏)的 3D 游戏时,我想知道天气是否应该在遇到更多图形问题之前立即切换到 OpenGL,或者是否有改进的方法算法在视图和模型中检查正确类型的更改的性能?

【问题讨论】:

  • 你已经问过同样的问题here...
  • 问题是现在我正在寻找一种完全不同的方法来解决这个问题。此外,我通过从 Java 6 更新到 Java 7 解决了整个问题(我工作的 PC 很长时间没有更新),并且通过 java 本身的性能提高解决了整个问题......

标签: java performance opengl theory graphics2d


【解决方案1】:

为每个图块声明一个由boolean 组成的二维数组,并声明一个int 变量来保持更改的常量,并在每次更改时更新它们,例如:

public void updateTiles(){

    if(changeType == NO_CHANGE){
        //do something
    }
    else if(changeType == BOARD_MOVED){
        repaint();
    }
    else if(changeType == TILE_CHANGED) {
        for(int i = 0; i < changeList.length; i++) {
            for(int j = 0; j < changeList[i].length; j++) {
                if(changeList[i][j]) {
                    repaint(i * TILE_SIZE, j * TILE_SIZE, TILE_SIZE, TILE_SIZE );
                    changeList[i][j] = false;
                }
            }
        }
    }

    changeType == NO_CHANGE; 
}

【讨论】:

  • 问题是,每当您调用 repaint() 时,窗口的整个图形“缓冲区”(由于缺乏更好的定义)都会被清除,因此当您调用 repaint 时,因此 paintComponent(g ) ,无论如何您都需要重新绘制所有瓷砖。但是,当人们可以找到并定义“要更新”图块所在的区域并使用 4 个 int 参数调用 repaint 时,这个想法可能会奏效......
【解决方案2】:

可以通过执行类似的操作来逐步更新 UI

void tileChanged(final Tile tile) {
    EventQueue.invokeLater(new Runnable() {
        @Override public void run() {
            tile.renderTo(jpanel.getGraphics());
        }
    };
}

或者您可以尝试tune Java 2D rendering,例如通过切换渲染管道。

或者您可以放弃 Java 2D,直接与 Open GL 对话,例如通过LWJGL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 2014-06-24
    • 2021-07-24
    • 2015-09-16
    • 2017-02-28
    • 2015-02-26
    相关资源
    最近更新 更多