Время вашего кода
Совершенно определенно быстрее нарисовать изображение много раз, чем нарисовать круг или строку много раз, и это очень легко проверить. В начале вашего метода paintComponent () добавьте строку:
paintComponent(){
long start = System.currentTimeMillis();
...
// draw 100,000 circles as images or circles
...
System.out.println("Rendering time: " +
(start - System.currentTimeMillis()) + " ms");
}
Если время все время оказывается равным нулю, вместо этого вы можете использовать System.nanoTime ().
Краска в кэшированное изображение
Еще одна вещь, которую вы можете сделать, это нарисовать эти круги на изображении и воссоздать изображение только при изменении содержимого. Если ничего не изменилось, просто нарисуйте это изображение на объекте Graphics2D вместо перерисовки всех кругов. Это обычно называется двойной буферизацией. Вы также можете использовать Volatile Images , чтобы воспользоваться аппаратным ускорением.
Создание совместимых изображений
Вы также должны убедиться, что используете изображения, совместимые с монитором пользователя, с помощью createCompatibleImage (), как показано ниже:
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
// Create an image that does not support transparency
BufferedImage bimage = gc.createCompatibleImage(width, height, Transparency.OPAQUE);
// Create an image that supports transparent pixels
bimage = gc.createCompatibleImage(width, height, Transparency.BITMASK);
// Create an image that supports arbitrary levels of transparency
bimage = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT);
Дополнительные советы
Я бы порекомендовал книгу Грязные богатые клиенты . У этого есть много хороших подсказок для ускорения колебания. Особенно обратите внимание на главы 4 и 5 об изображениях и производительности.