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 deficiente | Có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 [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 deficiente | Có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. |