我正在尝试通过尝试不同的概念来设计和可视化环境,从而对 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/