for (int i = 0; i < bricksList.size(); i++) {
BufferedImage image;
try {
image = ImageIO.read(new File(bricksList.get(i).img));
g.drawImage(image, bricksList.get(i).x, bricksList.get(i).y, null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我试图使用paintComponent()方法绘制80个图像 . 我还有另一个对象,当我按下右箭头键,继续向右移动,当按下左箭头键时,它继续向左移动,依此类推(使用按键事件) . 但是每次调用paint组件时,其他可移动对象的移动变得非常慢 . 我怎样才能顺利运行 . 我怎样才能阻止砖块每次涂漆?
2 回答
假设您的代码摘录来自您的
paintComponent()
方法,那么您在那里做的工作远比您应该做的要多得多 . 在每次更新时,paintComponent()
必须从磁盘读取每个文件(I / O非常昂贵),并从其内容构建BufferedImage
(不一定便宜) . 然后它只丢弃图像,这个图像看起来可能至少达到几十KB,最终会开始对GC施加压力 .除非你有理由期望在程序运行时修改图像文件(甚至可能会修改它们),你可以通过每次读取所有文件来显着提高性能,并保留
BufferedImage
对象由paintComponent()
重复使用 . 如果图像的相对位置没有改变,那么你甚至可以考虑从它们的内容构建一个大图像,然后让它绘制 .您可以通过预先加载图像来大大加快printComponent方法的速度
在你的构造函数中创建一个像BricksListImgs这样的列表
然后在paintComponent方法中从BriksListImgs中绘制图像