Предотвращение обновления статических данных

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

Код с низкой производительностьюКод с лучшей производительностью

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

[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

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