Быстрое построение пикселов с использованием SWT?
Вопрос
Я ищу быстрый и простой способ отображения пикселей произвольного цвета на SWT Canvas.Пока что я использую что-то подобное:
// initialization:
GC gc = new GC(canvas);
// inside the drawing loop:
Color cc = new Color(display, r, g, b);
gc.setForeground(cc);
gc.drawPoint(x, y);
cc.dispose();
Это ужасно, ужасно медленно.заполнение холста размером 300х300 пикселей занимает около полутора секунд.Я мог бы создать изображение за кадром, установить в нем пиксели, а затем нарисовать изображение.Это будет быстрее, но я специально хочу постепенный эффект рисования при нанесении изображения пиксель за пикселем на холст.
Решение
Вы могли бы нарисовать несколько закадровых изображений, постепенно заполняя область размером 300х300.Таким образом, вы можете контролировать, с какой скоростью должно появиться изображение.
Другие советы
Держу пари, что то, что убивает производительность, - это выделение и высвобождение 90 000 Color
Объекты.Помните, что в SWT каждый Color
объект выделяет собственные ресурсы, именно поэтому вы должны dispose()
IT.Это означает, что каждый раз, когда вы выделяете и утилизируете Color
объект, вам необходимо перейти с JVM на машинный код и обратно.
Можете ли вы кэшировать свой Color
экземпляры, находящиеся в цикле 300x300 пикселей, а затем удаляющие объекты после вашего цикла?Вам понадобится несколько интеллектуальный кэш, который содержит не более такого количества объектов, а после этого удалит некоторые из своих записей, но это должно ускорить процесс значительно.
Создайте объект BufferedImage:
BufferedImage bi = new new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);
внутри цикла рисования установите свои пиксели:
bi.setRGB(x, y, int_rgb);
...
и, наконец, отобразите буферизованное изображение:
g.drawImage(bi, 0, 0, null);
Если вы обнаружите, что setRGB() работает медленно, вы можете получить доступ к растровым данным напрямую:
int[] raster = ((DataBufferInt)bi.getRaster().getDataBuffer()).getData();
и позже
raster[y * 300 + x] = int_rgb;