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

标签 java performance opengl theory graphics2d

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

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

它工作得很好,但我已经到了需要反复检查整个游戏模型并更新 View 的地步,基本上每 1/10 秒就会发生一些变化。

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

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

最佳答案

为每个图 block 声明一个 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; 
}

关于java - 调整 JComponent 中的重绘以提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13092142/

相关文章:

java - 将java代码重写为groovy代码

c++ - 访问指针的速度

opengl - opengl中图像部分透明部分周围的暗光晕

performance - 最佳Visual Studio硬件升级

javascript - 检查浏览器是否支持 `.textContent` 的最佳方法?

java - GLSL 移动点光源

c++ - OpenGL 纹理加载困境

java - 使用 CXF 附加 SOAP 处理程序

java - PDFClown:创建 TextMarkup 会导致 TextMarkup 的框不准确

java - 如何防止ContextMenu关闭?