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 adrawnow
.La función
hgtransform
envía la matriz de transformada para la misma rotación al subproceso del renderizador.
Código con un rendimiento deficiente | Có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 % 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 |