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