Быстрое построение пикселов с использованием SWT?

StackOverflow https://stackoverflow.com/questions/698620

Вопрос

Я ищу быстрый и простой способ отображения пикселей произвольного цвета на 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top