Main Content

Evitar actualizar los datos estadísticos

Si solo una pequeña parte de los datos que definen una escena gráfica cambia con cada actualización de la pantalla, puede mejorar el rendimiento al actualizar solo los datos que cambian. El siguiente ejemplo ilustra esta técnica.

Código con un rendimiento deficienteCódigo con un mejor rendimiento

En este ejemplo, un marcador se mueve por la superficie creando tanto objetos ambos objetos con cada paso por el bucle.

[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

Cree una superficie, después, actualice los XData, YData y ZData del marcador del bucle. Solo los datos del marcador cambian en cada interacción.

[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

Segmentación de datos para reducir el tiempo de actualización

Tenga en cuenta el caso en que los datos de un objeto crecen mucho mientras el código se ejecuta en un bucle, como una línea que representa una señal en el tiempo.

Con cada llamada a drawnow, las actualizaciones se pasan al renderizador. El rendimiento disminuye a medida que los arreglos de datos aumentan su tamaño. Si utiliza este patrón, adopte el enfoque de segmentación descrito en el ejemplo de la derecha.

Código con un rendimiento deficienteCódigo con un mejor rendimiento
% 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

El rendimiento de este código es mejor ya que el factor que limita es la cantidad de datos enviados durante las actualizaciones.