2011-03-03 5 views
0

레이어 지원으로 페인팅 도구를 구현하려고합니다. 각 레이어에 대해 WritableRaster를 만듭니다. 캔버스를 표시하려면 레이어를 병합해야합니다. 이 작업을 수행하는 가장 효율적인 방법은 무엇입니까? 나는 bufferedImage를 사용하고, 래스터를 설정하고 각 레이어를 알파 합성물이있는 그래픽 컨텍스트에 그릴 수 있습니다. 그러나 데이터 수준에서 병합하고 단일 이미지를 그리는 것이 더 좋고/빠르지 않습니까?래스터 합치기

편집 : 프로필을 작성했습니다. 내가 전에 각 계층에 대한 BufferedImage의 대신 WritableRasters을 사용하고 눈에 띄는 지연이 없었다

//tmp.getRaster().setRect(layer.getRaster()); // VERY slow 
tmp.getRaster().setDataElements(0, 0, layer.getRaster()); //slow 
g2.drawImage(tmp, 0, 0, scaledDim.width, scaledDim.height, null); 

:이처럼 내 현재의 접근 방식은 모습입니다.

내 다음 단계는 상단 및 하단 레이어를 캐싱하여 3 개의 이미지 만 그릴 수 있습니다. 아마도 그 문제를 해결할 수있을 것입니다.

답변

0

제 생각에 래스터 그리기는 "데이터 수준에서 병합"과 거의 같습니다.

병목 현상이 발생하지 않는 한 걱정할 필요가 없습니다.

0

어쩌면 당신은 JAI을 사용할 수 있습니다 : 당신이 블럭 전송하는 경우 (그릴)

ParameterBlock pb = new ParameterBlock(); 
pb.add(bufImage1); 
pb.add(bufImage2); 
pb.add(.... 
RenderedImage ri = JAI.create("xor",pb); 
0

그들 각각의 이미지 버퍼에, 당신은 아마 그래픽 카드 가속을 사용하고 있습니다.

개별 버퍼를 루프하여 손으로 병합하면 (이 작업은 "데이터 수준에서 수행"을 의미하는 것으로 가정 함) CPU를 사용하게됩니다.

실제로 실제로 손으로하는 것은 bl30보다 이 더 느립니다..


그래서 원래의 솔루션이 가장 좋습니다. 그래픽 카드를 사용하면 그래픽 카드가 잘 작동합니다.

0

좋아, 그래서 상단 및 하단 레이어 캐시를 소개하고 지금은 꽤 좋은 성능을 가지고. 내 메모리가 렌더링 시간에 영향을 미치지 않고 처리 할 수있는만큼 많은 레이어를 추가 할 수 있습니다.