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