効率化


効率よく処理するための機能についてです。

SharedGroup / Switch / OrderedGroup / 戻る / トップページ


SharedGroup

Retained Mode でまったく同じ物体 (中身が同じ Shape3D オブジェクト) を複数箇所に表示させたい時、 Shape3D オブジェクトを複製する必要があります。 ところが、まったく同じオブジェクトを作る事は メモリーを余分に消費してしまいますし、 例えば色を変更したい時に全てのオブジェクトの色を 変更しなければならないなど非効率的です。
 
そこで SharedGroup クラスと Link クラスを使います。 これらのクラスは SceneGraph でリンクを実現するものです。
 
まず、Shape3D オブジェクトなど SceneGraph に複数ぶら下げたい オブジェクトを SharedGroup オブジェクトにぶら下げます。
	SharedGroup shared=new SharedGroup();
	shared.addChild(new ColorCube());	// 色付き立方体
そして、Link オブジェクトを SceneGraph にぶら下げます。
	root.addChild(new Link(shared));	// 原点に表示
	
	Transform3D transform=new Transform3D();
	transform.setTranslation(new Vector3d(1.0,0.0,0.0));
	TransformGroup translation=new TransformGroup(transform);
	translation.addChild(new Link(shared));
	root.addChild(translation);	// (1.0,0.0,0.0) に表示
SharedGroup オブジェクトは SceneGraph にぶら下げない点に注意してください。

Switch

Retained Mode で例えば、 高速化のため視点の後ろにある物体の処理を省くよう 特定のオブジェクトを SceneGraph から一時的にはずしたりしたい時があります。 しかし、SceneGraph へのオブジェクトの追加や削除自体に時間がかかりますし、 Java3D の最適化 (compile など) も受け難くなります。
 
そこで Switch クラスが用意されています。 このクラスは Group の 1 つでその下にぶら下げられている オブジェクトの 有効/無効 を切り替えられるものです。
 
有効/無効 にするオブジェクトの指定方法には 2 種類の方法が用意されています。
 
まず、1 つめの方法は有効とするオブジェクトをインデックスで 指定する方法です。 Switch オブジェクトは通常の Group と同じように扱いますが、 setWhichChild(int child) メソッドまたはコンストラクタ Switch(int whichChild) で有効にする オブジェクトのインデックスを指定します。 インデックスは Switch オブジェクトに追加した順に 0,1,2,... と付けられます。
	Switch selecter=new Switch();
	selecter.addChild(new Sphere());	// 球 (インデックス 0)
	selecter.addChild(new ColorCube());	// 色付き立方体 (インデックス 1)
	selecter.setWhichChild(0);	// 球を表示
この場合、インデックスで指定されないオブジェクトは無効になります。 インデックスには全てのオブジェクトを有効にする定数 CHILD_ALL や全てのオブジェクトを無効にする定数 CHILD_NONE を指定する事もできます。
 
2 つめの方法はオブジェクトごとに 有効/無効 を設定する方法です。 上の方法でインデックスに定数 CHILD_MASK を指定し、 setChildMask(BitSet childMask) メソッドで 有効/無効 を一括設定します。
	Switch selecter=new Switch(Switch.CHILD_MASK);
	selecter.addChild(new Sphere());	// 球 (インデックス 0)
	selecter.addChild(new ColorCube());	// 色付き立方体 (インデックス 1)
	BitSet flag=new BitSet(2);
	flag.set(0);	// インデックス 0 を有効に
	flag.clear(1);	// インデックス 1 を無効に
	selecter.setChildMask(flag);
BitSet (java.util.BitSet です) については API マニュアルを参照してください。

OrderedGroup

SceneGraph にぶら下がっている全てのオブジェクトは 自動で最適な順に処理されます。 しかし、順番に処理してもらいたい時もでてきます。
 
そのために OrderedGroup クラスがあります。 このクラスは Group の 1 つで その下にぶら下げられているオブジェクトは 必ずぶら下げられた順に処理されます。
	OrderedGroup orderedGroup=new OrderedGroup();
	orderedGroup.addChild(new Sphere());	// 球 (1 番目に処理される)
	orderedGroup.addChild(new ColorCube());	// 色付き立方体 (2 番目に処理される)

戻る