Main Content

高效变换对象

移动对象(例如,通过旋转移动)需要变换定义对象的数据。您可以通过利用图形硬件能将变换应用到数据这一功能来提高性能。这样,您就可以避免将变换后的数据发送给渲染器。您只要发送 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

使用 hgtransform 会将变换应用到瓶颈的渲染器端。

% 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