Main Content

適切なオブジェクト作成方法

オブジェクトのオーバーヘッド

グラフィックス オブジェクトは、情報の格納 (データおよびオブジェクトの特性)、特定イベントの発生のリッスン (コールバック プロパティ)、および存在する他のオブジェクトへの変更を引き起こす可能性のある (座標軸の範囲の更新など)、複雑な構造体です。したがって、オブジェクトを作成するとリソースが消費されます。

パフォーマンスが重要な考慮事項になる場合は、最小限のリソースが消費される方法で目的の実現に努力してください。

通常、以下のガイドラインに従うことでパフォーマンスを改善できます。

  • 不要なオブジェクトを作成しない

  • オブジェクト階層を検索しない

不要なオブジェクトを作成しない

作成するオブジェクトの数を少なくしても同じ結果が得られる方法を検討します。たとえば、マーカーのみを表示する点からなる 10 行 1,000 列の配列をプロットするとします。

次のコードは 1,000 個の line オブジェクトを作成します。

x = rand(10,1000);
y = rand(10,1000);
plot(x,y,'LineStyle','none','Marker','.','Color','b');

データを 10 行 1,000 列から 10,000 行 1 列に変換します。次のコードでは、同じように見えるグラフが作成されますが、作成されるオブジェクトは 1 つだけです。

plot(x(:),y(:),'LineStyle','none','Marker','.','Color','b')

NaN を使用した複数ラインのシミュレーション

座標データに NaN が含まれる場合、MATLAB® はそれらの点をレンダリングしません。頂点のデータに NaN を追加することで、複数のラインのように見えるライン セグメントを作成できます。各データ ベクトル内の同じ要素位置に NaN を配置ます。たとえば、次のコードでは、3 本の異なるラインが作成されます。

x = [0:10,NaN,20:30,NaN,40:50];
y = [0:10,NaN,0:10,NaN,0:10];
line(x,y)

新規オブジェクトを作成せずにデータを変更

基本的に同じグラフに別のデータを表示するには、グラフ全体を再作成するよりも、既存オブジェクト (line、text 等) のデータ更新を行う方が効率的です。

たとえば、特定のパラメーターの変更がデータに与える影響を可視化したいとします。

  1. 事前に定義可能な軸の範囲を設定するか、または軸の範囲モードを manual に設定します。

  2. 新規パラメーターを使ってデータを再計算します。

  3. 新規データを使ってグラフ内で用いられるライン、テキスト等のオブジェクトの Data プロパティを更新します。

  4. drawnow を呼び出して、Figure (および Figure 内のすべての子オブジェクト) を更新します。

たとえば、データの変更に伴ってグラフを更新する場合を考えます。

figure
z = peaks;
h = surf(z);
drawnow 
zlim([min(z(:)), max(z(:))]);
for k = 1:50
   h.ZData = (0.01+sin(2*pi*k/20)*z);
   drawnow
end