Main Content

정적 데이터 업데이트 방지하기

각 화면 업데이트마다 그래픽스 장면을 정의하는 데이터의 작은 부분만 변경되는 경우, 변경되는 데이터만 업데이트하여 성능을 향상시킬 수 있습니다. 다음 예제에서는 이 기법을 보여줍니다.

성능이 낮은 코드성능이 높은 코드

이 예제에서는 루프를 통과할 때마다 마커 객체 및 곡면 객체를 모두 생성하여 마커가 곡면을 따라 이동합니다.

[sx,sy,sz] = peaks(500);
nframes = 490;

for t = 1:nframes
   surf(sx,sy,sz,'EdgeColor','none')
   hold on
   plot3(sx(t+10,t),sy(t,t+10),...
         sz(t+10,t+10)+0.5,'o',...
        'MarkerFaceColor','red',...
        'MarkerSize',14)
   hold off
   drawnow
end

곡면을 생성한 후 루프에서 마커의 XData, YDataZData를 업데이트합니다. 매번 반복할 때마다 마커 데이터만 변경됩니다.

[sx,sy,sz] = peaks(500);
nframes = 490;

surf(sx,sy,sz,'EdgeColor','none')
hold on
h = plot3(sx(1,1),sy(1,1),sz(1,1),'o',...
   'MarkerFaceColor','red',...
   'MarkerSize',14);
hold off

for t = 1:nframes
   set(h,'XData',sx(t+10,t),...
      'YData',sy(t,t+10),...
      'ZData',sz(t+10,t+10)+0.5)
   drawnow
end

업데이트 시간을 단축하도록 데이터 분할

시간에 따라 신호를 추적하는 선과 같이 루프에서 코드가 실행되는 동안 객체의 데이터가 매우 크게 증가하는 상황을 고려해 보십시오.

drawnow에 대한 각 호출마다 업데이트가 렌더러로 전달됩니다. 데이터 배열 크기가 증가함에 따라 성능이 저하됩니다. 이 패턴을 사용하는 경우 이 예제의 오른쪽에 설명된 분할 접근 방식을 채택하십시오.

성능이 낮은 코드성능이 높은 코드
% Grow data
figure('Position',[10,10,1500,400])
n = 5000;


h = stairs(1,1);
ax = gca;
ax.XLim = [1,n];
ax.YLim = [0,1];
ax.ZLim = [0,1];
ax.NextPlot = 'add';

xd = 1:n;
yd = rand(1,n);

tic
for ix = 1:n
   set(h,'XData',xd(1:ix),'YData',yd(1:ix));
   drawnow;
end
toc
% Segment data
figure('Position',[10,10,1500,400])
n = 5000;
seg_size = 500;
xd = 1:n;
yd = rand(1,n);

h = stairs(1,1);
ax = gca;
ax.XLim = [1,n];
ax.YLim = [0,1];
ax.ZLim = [0,1];
ax.NextPlot = 'add';

tic
start = 1;
for ix=1:n
   % Limit object size
   if (ix-start > seg_size)
      start = ix-1;
      h = stairs(1,1);
   end
   set(h,'XData',xd(start:ix),...
      'YData',yd(start:ix));
   % Update display in 50 point chunks
   if mod(ix,50) == 0
      drawnow;
   end
end
toc

이 코드의 경우 제한 요소는 업데이트 동안 전송되는 데이터의 양이므로 성능이 더 높습니다.