Если с каждым обновлением экрана изменяется только небольшой фрагмент данных, определяющих графическую сцену, можно улучшить эффективность, обновив только изменяющиеся данные. Следующий пример иллюстрирует этот метод.
Код с плохой эффективностью | Код с лучшей эффективностью |
---|---|
В этом примере маркер перемещается вдоль поверхности, создавая оба объекта, каждый из которых проходит через цикл. [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 Эффективность этого кода лучше, потому что ограничивающим фактором является объем данных, отправляемых во время обновления. |