SWT를 사용하여 빠른 픽셀 플로팅을 하시겠습니까?
문제
저는 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 캔버스를 픽셀로 채우는 데 약 1.5초가 걸립니다.화면 밖에서 이미지를 만들고 그 안에 픽셀을 설정한 다음 이미지를 그릴 수 있습니다.이것이 더 빠르겠지만 특히 캔버스에 이미지를 픽셀 단위로 그리는 점진적인 페인팅 효과를 원합니다.
해결책
300x300 영역을 점차적으로 채우는 여러 개의 오프스크린 이미지를 그릴 수 있습니다.이렇게 하면 이미지가 표시되는 속도를 제어할 수 있습니다.
다른 팁
나는 성능을 죽이는 것이 90,000을 할당하고 방출한다고 확신합니다. Color
사물. SWT에서는 각각을 기억하십시오 Color
물체는 기본 자원을 할당하므로 dispose()
그것. 이것은 당신이 할당하고 처분 할 때마다 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;