Main Content

그래픽스 속성을 가져오고 설정하기 위한 코드 최적화하기

자동으로 계산되는 속성

특정 속성은 다른 속성의 값에 대한 종속성을 가집니다. MATLAB®은 자동으로 이러한 속성의 값을 계산하여 현재 그래픽스 모델을 기준으로 값을 업데이트합니다. 예를 들어, 축 제한은 축 눈금에 사용되는 값에 영향을 주고, 이는 또한 축 눈금 레이블에 영향을 미칩니다.

계산되는 속성을 쿼리하면 MATLAB이 묵시적 drawnow를 수행하여 속성값을 반환하기 전에 모든 속성값이 최신이 되도록 합니다. 쿼리를 실행하면 모든 종속 속성에 대한 전체 업데이트 및 화면 업데이트가 수행됩니다.

MATLAB은 특정 속성의 값을 계산하는데, 이는 해당 속성을 좌우하는 다른 값을 기준으로 이루어집니다. 예를 들어, 플로팅 함수는 축 제한, 눈금 레이블 및 플로팅된 데이터와 Figure 크기에 적절한 크기를 가진 좌표축을 자동으로 생성합니다.

MATLAB 그래픽스는 필요한 경우 전체 업데이트를 수행한 후에 계산되는 속성의 값을 반환하여 반환되는 값이 최신이 되도록 합니다.

다음 표에는 더 자주 계산되는 일부 속성이 나와 있습니다.

객체속성MATLAB에서 해당 속성을 계산하는 경우

좌표축

CameraPosition, CameraTarget, CameraUpVector, CameraViewAngle

항상

 

Position, OuterPosition, TightInset

항상

 

XLim, YLim, ZLim

항상

 

XTick, YTick, ZTick, XMinorTick, YMinorTick, ZMinorTick

항상

 

XTickLabel, YTickLabel, ZTickLabel, TickDir

항상

 

SortMethod

항상

텍스트

Extent

항상

 

Position

text 객체가 좌표축 제목이나 축 레이블로 사용되는 경우에만

 

FontSize, FontWeight

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 속성은 화면 해상도, Figure 크기 및 축 제한과 같은 다른 값에 따라 달라지므로, 이 속성을 쿼리하면 전체 업데이트가 발생할 수 있습니다.

  • Position 속성을 설정하면 그 다음에 Extent 속성 가져오기가 발생할 때마다 전체 업데이트를 요하게 됩니다.

이 코드는 다음과 같은 이유로 높은 성능을 보입니다.

  • 하나의 루프에서 모든 속성값을 쿼리하고 배열에 이러한 값을 저장합니다.

  • 별도의 루프에서 모든 속성값을 설정합니다.

  • 두 번째 루프가 완료된 후 drawnow를 호출합니다.

레이블을 회전하도록 텍스트의 Extent 변경

텍스트의 Extent 속성을 변경하여 좌표축 레이블을 회전하도록 하는 경우 axes 속성 XTickLabelRotation, YTickLabelRotationZTickLabelRotation을 사용하는 것이 더 효율적입니다.