Main Content

Transformar objetos de forma eficiente

Mover objetos, por ejemplo por rotación, requiere transformar los datos que definen los objetos. Puede mejorar el rendimiento aprovechándose del hecho de que el hardware gráfico puede aplicar transformaciones a los datos. Después, puede evitar enviar los datos transformados al renderizador. En cambio, envíe solo la matriz de transformada 4x4.

Para comprobar los beneficios de rendimiento de este enfoque, use la función hgtransform para agrupar los objetos que desea mover.

Los siguientes ejemplos definen una esfera y la rotan utilizando dos técnicas para comparar el rendimiento:

  • La función rotate transforma los datos de la esfera y los envía al subproceso del renderizador con cada llamada a drawnow.

  • La función hgtransform envía la matriz de transformada para la misma rotación al subproceso del renderizador.

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

Cuando los datos de objetos son de gran tamaño, el cuello de botella de actualización se convierte en un factor limitante.

% Using rotate
figure
[x,y,z] = sphere(270);

s = surf(x,y,z,z,'EdgeColor','none');
axis vis3d
for ang = 1:360
   rotate(s,[1,1,1],1)
   drawnow
end

Al utilizar hgtransform, se aplica la transformada en el lado del renderizador del cuello de botella.

% Using hgtransform
figure
ax = axes;
[x,y,z] = sphere(270);

% Transform object contains the surface
grp = hgtransform('Parent',ax);
s = surf(ax,x,y,z,z,'Parent',grp,...
   'EdgeColor','none');

view(3)
grid on
axis vis3d

% Apply the transform
tic
for ang = linspace(0,2*pi,360)
   tm = makehgtform('axisrotate',[1,1,1],ang);
   grp.Matrix = tm;
   drawnow
end
toc