Избегайте обновления статических данных

Если с каждым обновлением экрана изменяется только небольшой фрагмент данных, определяющих графическую сцену, можно улучшить эффективность, обновив только изменяющиеся данные. Следующий пример иллюстрирует этот метод.

Код с плохой эффективностьюКод с лучшей эффективностью

В этом примере маркер перемещается вдоль поверхности, создавая оба объекта, каждый из которых проходит через цикл.

[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, YData, и ZData маркера в цикле. В каждой итерации изменяются только данные о маркере.

[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

Эффективность этого кода лучше, потому что ограничивающим фактором является объем данных, отправляемых во время обновления.

Для просмотра документации необходимо авторизоваться на сайте