高效变换对象
移动对象(例如,通过旋转移动)需要变换定义对象的数据。您可以通过利用图形硬件能将变换应用到数据这一功能来提高性能。这样,您就可以避免将变换后的数据发送给渲染器。您只要发送 4×4 变换矩阵。
要发挥此方法的性能优势,请使用 hgtransform
函数对要移动的对象分组。
以下示例定义一个球体,并使用两种方法旋转以比较性能:
rotate
函数变换球体的数据并每次调用drawnow
时将数据发送给渲染器线程。hgtransform
函数将同样旋转的变换矩阵发送给渲染器线程。
性能不佳的代码 | 性能更高的代码 |
---|---|
当对象数据很大时,更新操作瓶颈就成为限制因素。 % 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 | 使用 % 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 |