gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:30:52 24 4
gpt4 key购买 nike

我正在尝试对 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 游戏(甚至像 minecraft 这样的简单游戏)时,我想知道天气是否应该在遇到更多图形问题之前立即切换到 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com