exponenta event banner

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

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

Код с низкой производительностьюКод с более высокой производительностью

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

[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

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