그래픽스 속성을 가져오고 설정하기 위한 코드 최적화하기
자동으로 계산되는 속성
MATLAB®은 일부 속성의 값을 다른 속성의 값을 기반으로 자동으로 계산합니다. 예를 들어, 축 제한은 축 눈금에 사용되는 값에 영향을 주고, 이는 또한 축 눈금 레이블에 영향을 미칩니다.
모드 속성은 특정 속성이 언제 계산되는지에도 영향을 미칠 수 있습니다. 모드 속성은 특정 객체 속성과 쌍을 이루며, 이름이 "Mode"라는 단어로 끝납니다. 예를 들어, axes 객체에는 XTick 속성과 XTickMode 속성이 있습니다. XTickMode 속성의 값이 "auto"인 경우, MATLAB은 조건(예: x축 제한)이 변경될 때 XTick 속성을 업데이트합니다. XTickMode 속성의 값이 "manual"인 경우, XTick 속성은 다른 속성값에 관계없이 보존됩니다.
MATLAB은 다른 객체를 기반으로 특정 속성의 값을 계산할 수도 있습니다. 예를 들어, 플로팅 함수는 축 제한, 눈금 레이블 및 플로팅된 데이터와 Figure 크기에 적절한 크기를 가진 좌표축을 자동으로 생성합니다.
계산되는 속성을 쿼리하면 MATLAB이 묵시적 drawnow를 수행하여 속성값을 반환하기 전에 모든 속성값이 최신이 되도록 합니다. 쿼리를 실행하면 모든 종속 속성에 대한 전체 업데이트 및 화면 업데이트가 수행됩니다.
MATLAB은 필요한 경우 전체 업데이트를 수행한 후에 계산되는 속성의 값을 반환하여 반환되는 값이 최신이 되도록 합니다.
다음 표에는 더 자주 계산되는 일부 속성이 나와 있습니다.
| 객체 | 속성 | MATLAB에서 해당 속성을 계산하는 경우 |
|---|---|---|
좌표축 |
| 해당 모드 속성이 |
|
| |
OuterPosition |
| |
TightInset | 항상 | |
| 해당 모드 속성이 | |
| 해당 모드 속성이 | |
| 해당 모드 속성이 | |
| 해당 모드 속성이 | |
텍스트 |
| 항상 |
| text 객체가 좌표축 제목, 부제목, 축 레이블 또는 보조 레이블로 사용되고 | |
| text 객체가 좌표축 제목, 부제목, 축 레이블 또는 보조 레이블로 사용되고 해당 모드 속성이 |
Set 및 Get의 비효율적인 사이클
속성값을 설정하면 그래픽스 모델의 상태를 변경하고 업데이트가 필요하다고 표시하게 됩니다. 계산되는 속성을 쿼리할 때 그래픽스 모델 및 그래픽스 하드웨어가 동기화되지 않은 경우 MATLAB이 업데이트를 수행해야 합니다.
동일한 루프에서 속성을 가져오고 설정하는 경우 루프를 통과할 때마다 업데이트가 수행되는 상황을 생성할 수 있습니다.
get을 실행하면 업데이트가 수행됩니다.set은 그래픽스 모델을 업데이트가 필요하다고 표시합니다.
이 주기가 매번 루프를 통과할 때마다 반복됩니다. 다음 예제와 같이 한 루프에서 모든 속성 쿼리를 실행하고 모든 속성 설정을 다른 루프에서 실행하는 것이 더욱 효과적입니다.
이 예제에서는 text 객체의 Position 속성과 Extent 속성을 모두 가져온 다음 Position 속성을 설정합니다.
| 성능이 낮은 코드 | 성능이 높은 코드 |
|---|---|
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을 사용하는 것이 더 효율적입니다.