次のチュートリアルでは、文字列形式で収集される特定のデータがスクリプトの 2 つのランの間で変更されたかどうかを決定するために "System.String
によって公開される .GetHashCode()
メソッドを使用する方法を示します。
関連トピック:
全体の流れ:
MAXScript 関数を定義して、すべてのシーン オブジェクトのハッシュ コードを計算します。
ストリング内のすべてのオブジェクトの名前、変換行列、および親を収集します。
ストリングの HashCode を取得して、返します。
例
fn getHashCodeFromGeometry = ( local hashStr = stringstream "" for obj in objects do ( print obj.name to:hashStr print obj.transform to:hashStr if obj.parent != undefined then print obj.parent.name to:hashStr )--end for loop (dotNetObject "System.String" hashStr).GetHashCode() )--end function
fn getHashCodeFromGeometry = (
タイマによって呼び出される MAXScript 関数を定義します。
local hashStr = stringstream ""
空の文字列ストリームを作成してデータを収集し、ハッシュ コードに変換します。
for obj in objects do (
すべてのシーン オブジェクトをループ処理します...
print obj.name to:hashStr print obj.transform to:hashStr
現在のオブジェクトの名前と変換をストリームに出力します。
if obj.parent != undefined then print obj.parent.name to:hashStr
オブジェクトに親が含まれる場合、親の名前もストリームに出力します。
)
(dotNetObject "System.String" hashStr).GetHashCode()
最後に、収集した文字列ストリームから System.String クラスのインスタンスを作成して、そのハッシュ コードを取得します。
)--end function
この関数が実際にどの程度有効であるかを確認します。
シーン コンテンツが変更されたときに複雑な、時間の掛かる計算を要するスクリプトを開発しているとします。たとえば、次のようなときにすべてのデータを再構築する必要があるとします。
シーン内のオブジェクトの数が変更された(オブジェクトが追加または削除された)とき
1 つまたは複数のオブジェクトの名前が変更されたとき
1 つまたは複数のオブジェクトが移動、回転、またはスケールされたとき
階層が変更された(親オブジェクトに対してオブジェクトがリンクあるいはリンク解除された)とき
前回のランからシーンが変更されていない場合には、最後の結果のキャッシュを作成して、次回のスクリプト実行時に同じ値を返すと便利です。データを実際に処理し直すよりもシーンの変更を確認することの方が大幅に速くなる場合には、この方法によって都合よく速度を上げることができるでしょう。
1 つの実行可能な手段としては、このシーン ステート データをすべてユーザ変数に格納し、objects.count 値を変数に割り当て、スクリプトの初回実行時にすべてのオブジェクトの名前、変換行列、および親の名前を配列内に収集してから、スクリプトで初期データを再計算する必要があるかを決定する必要が次回生じたら、同じ情報を再度収集し、すべての値を前回のランの結果と比較することができます。
シーンに 10,000 個以上のオブジェクトが含まれる場合、格納されるデータの量(および 2 つのデータ ットの収集と比較に必要な時間)は非常に膨大なものになります。
しかし、実際のデータ値は問題ではなく、それらがランの間で変更されたかどうかを知ることが目的であるため、1 つの long 型の整数値で上記すべての条件を表わす HashCode 値を使用します。必要なことは、関数を 1 回実行して、すべてのシーン オブジェクトの数、名前、変換および親を反映した HashCode 番号を取得することです。この処理の後、これらのプロパティのいずれかに前回のスクリプト実行時から変更があったことを確認する場合には、関数を再度呼び出して 2 つの値を比較できます。番号が同じ場合には、シーンは変更されていません。この場合、シーンが前回から変更されていないことが明らかであるため、データ再構築のステップをスキップできます。ハッシュ値が異なる場合は、シーンを再処理して実際のデータを収集する必要があります。
もちろん、上記の関数は HashCode の 1 つの使用例にすぎません。これはオブジェクトのプロパティを反映するように変更したり、文字列として表されるその他の値の状態を追跡するために使用することもできます。