그래픽스 속성을 가져오고 설정하기 위한 코드 최적화하기
자동으로 계산되는 속성
특정 속성은 다른 속성의 값에 대한 종속성을 가집니다. MATLAB®은 자동으로 이러한 속성의 값을 계산하여 현재 그래픽스 모델을 기준으로 값을 업데이트합니다. 예를 들어, 축 제한은 축 눈금에 사용되는 값에 영향을 주고, 이는 또한 축 눈금 레이블에 영향을 미칩니다.
계산되는 속성을 쿼리하면 MATLAB이 묵시적 drawnow
를 수행하여 속성값을 반환하기 전에 모든 속성값이 최신이 되도록 합니다. 쿼리를 실행하면 모든 종속 속성에 대한 전체 업데이트 및 화면 업데이트가 수행됩니다.
MATLAB은 특정 속성의 값을 계산하는데, 이는 해당 속성을 좌우하는 다른 값을 기준으로 이루어집니다. 예를 들어, 플로팅 함수는 축 제한, 눈금 레이블 및 플로팅된 데이터와 Figure 크기에 적절한 크기를 가진 좌표축을 자동으로 생성합니다.
MATLAB 그래픽스는 필요한 경우 전체 업데이트를 수행한 후에 계산되는 속성의 값을 반환하여 반환되는 값이 최신이 되도록 합니다.
다음 표에는 더 자주 계산되는 일부 속성이 나와 있습니다.
객체 | 속성 | MATLAB에서 해당 속성을 계산하는 경우 |
---|---|---|
좌표축 |
| 항상 |
| 항상 | |
| 항상 | |
| 항상 | |
| 항상 | |
| 항상 | |
텍스트 |
| 항상 |
| text 객체가 좌표축 제목이나 축 레이블로 사용되는 경우에만 | |
| text 객체가 좌표축 제목이나 축 레이블로 사용되는 경우에만 |
Set 및 Get의 비효율적인 사이클
속성값을 설정하면 그래픽스 모델의 상태를 변경하고 업데이트가 필요하다고 표시하게 됩니다. 자동 계산되는 속성을 쿼리하면 그래픽스 모델 및 그래픽스 하드웨어가 동기화되지 않은 경우 MATLAB이 업데이트를 수행해야 합니다.
동일한 루프에서 속성을 가져오고 설정하는 경우 루프를 통과할 때마다 업데이트가 수행되는 상황을 생성할 수 있습니다.
get
을 실행하면 업데이트가 수행됩니다.set
은 그래픽스 모델을 업데이트가 필요하다고 표시합니다.
이 주기가 매번 루프를 통과할 때마다 반복됩니다. 다음 예제와 같이 한 루프에서 모든 속성 쿼리를 실행하고 모든 속성 설정을 다른 루프에서 실행하는 것이 더욱 효과적입니다.
이 예제에서는 텍스트의 Extent
속성을 가져오고 설정합니다.
성능이 낮은 코드 | 성능이 높은 코드 |
---|---|
h = gobjects(1,500); p = zeros(500,3); for ix = 1:500 h(ix) = text(ix/500,ix/500,num2str(ix)); end drawnow % Gets and sets in the same loop, % prompting a full update at each pass for ix = 1:500 pos = get(h(ix),'Position'); ext = get(h(ix),'Extent'); p(ix,:) = [pos(1)+(ext(3)+ext(1)), ... pos(2)+ext(2)+ext(4),0]; set(h(ix),'Position',p(ix,:)) end drawnow | h = gobjects(1,500); p = zeros(500,3); for ix = 1:500 h(ix) = text(ix/500,ix/500,num2str(ix)); end drawnow % Get and save property values for ix=1:500 pos = get(h(ix),'Position'); ext = get(h(ix),'Extent'); p(ix,:) = [pos(1)+(ext(3)+ext(1)), ... pos(2)+ext(2)+ext(4),0]; end % Set the property values and % call a drawnow after the loop for ix=1:500 set(h(ix),'Position',p(ix,:)); end drawnow |
이 코드는 다음과 같은 이유로 낮은 성능을 보입니다.
| 이 코드는 다음과 같은 이유로 높은 성능을 보입니다.
|
레이블을 회전하도록 텍스트의 Extent
변경
텍스트의 Extent
속성을 변경하여 좌표축 레이블을 회전하도록 하는 경우 axes 속성 XTickLabelRotation
, YTickLabelRotation
및 ZTickLabelRotation
을 사용하는 것이 더 효율적입니다.