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