Построение только видимой области - неправильная идея. Как правило, вы действительно хотите создать BufferedImage, который будет содержать всю диаграмму, и тогда вам не нужно перекрашивать всю диаграмму 1000 раз в секунду. Если вы не можете буферизовать всю диаграмму (например, вы строите данные в режиме реального времени), вы должны по крайней мере сохранить ее для буферизации одной точки, если она больше 1px.
Заполнение фигур - очень дорогая операция в Java.
Следующий код ужасно медленный (при построении слишком большого количества точек)
for(int x=0; x < max; x++){
Ellipse2D.Double ellipse = new Ellipse2D.Double(x - 1.5, f(x) -1.5, 3, 3);
g.setPaint(color);
g.draw(ellipse);
g.fill(ellipse);
}
Должен быть заменен на
private BufferedImage createBufferedImage(Color color) {
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D buff = bufferedImage.createGraphics();
Ellipse2D.Double ellipse = new Ellipse2D.Double(0, 0, 3, 3);
buff.setPaint(color);
buff.draw(ellipse);
buff.fill(ellipse);
return bufferedImage;
}
AffineTransform at = new AffineTransform();
at.scale(1, 1);
createBufferedImage(Color.RED);
for(int x=0; x < max; x++){
at.setToIdentity();
at.translate(x - 2, y - 2);
g.drawImage(bufferedImage, at, null);
}
, который делает то же самое, только во много раз быстрее. AFAIK в JFreeChart, они не используют буферизацию должным образом, что является одной из причин, почему это так медленно.