调整JComponent中的重绘以提高性能

时间:2012-10-26 18:09:55

标签: java performance opengl theory graphics2d

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

在我的宝贝步骤中,我选择使用Swing并使用JComponent的paintComponent()方法来检索Graphics2D对象,然后使用该对象可视化我的游戏板。

它的效果非常好,但我已经到了需要反复检查整个游戏模型并更新视图的地步,基本上每1/10秒就可以改变一次。

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

现在提出问题:我正在寻找一种方法或意见,如何改善这种方法的性能。由于并非每块板上的每块瓷砖都会改变每一个“滴答”,我不需要“重新绘制”这块瓷砖。但相反,移动可视区域(相机偏移)会改变屏幕上每个图块的位置,因此需要在不同位置重新绘制。此外,后来实现的“将是”动画将需要不断更新视觉区域,而不管“发生了什么”。当观看具有高质量图形的3D游戏(甚至是像Minecraft这样的简单图形)时,运行于> 30 FPS,我想知道天气与否我应该立即切换到OpenGL,然后再遇到更多图形问题,或者是否有办法通过算法检查视图和模型中的正确类型的变化来提高性能? / p>

2 个答案:

答案 0 :(得分: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; 
}

答案 1 :(得分:1)

可以通过执行类似

的操作来逐步更新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