정적 데이터 업데이트 방지하기
각 화면 업데이트마다 그래픽스 장면을 정의하는 데이터의 작은 부분만 변경되는 경우, 변경되는 데이터만 업데이트하여 성능을 향상시킬 수 있습니다. 다음 예제에서는 이 기법을 보여줍니다.
성능이 낮은 코드 | 성능이 높은 코드 |
---|---|
이 예제에서는 루프를 통과할 때마다 마커 객체 및 곡면 객체를 모두 생성하여 마커가 곡면을 따라 이동합니다. [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 | 곡면을 생성한 후 루프에서 마커의 [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 이 코드의 경우 제한 요소는 업데이트 동안 전송되는 데이터의 양이므로 성능이 더 높습니다. |