Быстрое построение пикселей с помощью SWT? - PullRequest
3 голосов
/ 30 марта 2009

Я ищу быстрый и простой способ построения произвольно окрашенных пикселей в холсте SWT. Пока что я использую что-то подобное:

// 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();

Это ужасно медленно. заполнение холста размером 300x300 пикселями занимает около полутора секунд. Я мог бы создать изображение вне экрана, установить пиксели в нем и затем нарисовать изображение. Это будет быстрее, но я особенно хочу, чтобы эффект постепенного рисования изображения пиксель за пикселем на холсте.

Ответы [ 3 ]

4 голосов
/ 31 марта 2009

Могу поспорить, что убийственная производительность - это выделение и освобождение 90 000 Color объектов. Помните, что в SWT каждый Color объект выделяет собственные ресурсы, поэтому вы должны dispose() его. Это означает, что каждый раз, когда вы выделяете и удаляете объект Color, вы должны переходить от JVM к собственному коду и обратно.

Можете ли вы кэшировать свои Color экземпляры в цикле 300x300 пикселей, а затем утилизировать объекты после цикла? Вам понадобится несколько интеллектуальный кеш, который содержит максимум столько объектов, и после этого он удалит некоторые из его записей, но это должно значительно ускорить процесс .

1 голос
/ 31 марта 2009

Вы можете нарисовать несколько закадровых изображений, где вы постепенно заполняете область 300x300. Таким образом, вы можете контролировать скорость отображения изображения.

0 голосов
/ 20 декабря 2011

Создание объекта 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;
...