在某些情况下,Java重绘速度很慢
作者:互联网
我正在做一个简单的网格,每个正方形都用光标突出显示:
alt text http://img168.imageshack.us/img168/203/screenshottest.png
它们是几个JPanels,mapgrid和JLayeredPane内部的叠加层,mapgrid在底部. Mapgrid只是在初始化网格上绘制,其绘制方法为:
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
g2d.setColor(new Color(128, 128, 128, 255));
g2d.drawRect(tileSize * j, i * tileSize, tileSize, tileSize);
}
}
在叠加层JPanel中,突出显示发生的位置,这是在移动鼠标时重新绘制的内容:
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(new Color(255, 255, 128, 255));
g2d.drawRect((pointerX/tileSize)*tileSize,(pointerY/ tileSize)*tileSize, tileSize, tileSize);
}
我注意到,即使在移动鼠标时不重绘基础层(mapgrid),而只是透明的覆盖层,仍然缺乏性能.如果我给叠加JPanel提供背景,它的方式会更快.如果我删除了mapgrid Antialiasing,它的速度也会更快一点.
我不知道为什么给覆盖层一个背景(从而隐藏mapgrid)或在mapgrid中禁用抗锯齿会导致更好的性能.
有一个更好的方法吗?为什么会这样?
解决方法:
代替drawRect,您可以使用drawLine.您应该获得相同的视觉效果,但是我认为它将更快.
另外,如果背景始终相同,我建议在初始化时(或调整帧大小时)绘制到缓冲的图像,然后再绘制该图像.这样可以加快绘图速度.
标签:repaint,performance,java 来源: https://codeday.me/bug/20191106/2000675.html