2

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

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

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

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

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

4

2 回答 2

1

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

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

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

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

于 2012-10-26T19:26:20.460 回答
1

boolean为每个图块声明一个 2 维数组,以及一个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; 
}
于 2012-10-26T18:24:42.343 回答