Main Content

オブジェクトの効率的な変換

オブジェクトに対して回転などの移動を行うには、そのオブジェクトを定義したデータを変換する必要があります。パフォーマンスを改善するには、グラフィックス ハードウェアでデータに変換を適用できることを利用します。これにより、変換されたデータをレンダラーに送信するのを避けることができます。代わりに、4 行 4 列の変換行列のみを送信します。

この方法のパフォーマンス上の利点を実現するには、関数 hgtransform を使用して、移動するオブジェクトをグループ化します。

以下の例では、パフォーマンスを比較するために 2 つの手法を使用して球面を定義し、回転しています。

  • 関数 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