2

ネットワーク内のピアノードが一意の「ネットワークチャネル」(またはその他の形式の半秘密識別子) を決定するための共通または確立されたアルゴリズムはありますか?

私が働いている環境はSecondLifeです。同じ種類のオブジェクトの他の既存のネットワークに干渉することなく、ネットワークを形成できるようにする「チャネル」番号に同意する多くの同一のピアスクリプトオブジェクトを取得する方法を見つけようとしています。

すべてのオブジェクトはほぼ同時にインスタンス化され、(共通の) システム時間にアクセスできます。

私が考えたアプローチ:

  1. インスタンス化の時間ベース。チャネルは UNIX 時間から (md5 によって) 導出されます。問題は「ほぼ同時期」の部分。それらは、新しい秒のカスプでインスタンス化される場合があります。

  2. ランダム待機。オブジェクトをランダムに待機させ、最初にウェイクするオブジェクトによって決定された (ランダムに生成された) チャネル番号をアナウンスします。問題は、システムの時間粒度が低く、アナウンスが処理される前に複数のオブジェクトが起動する可能性があることです。

  3. 1 と 2 を組み合わせます。ランダムな量を待った後に高解像度のタイムスタンプをアナウンスし、アナウンスされた最も低いタイムスタンプからチャネルを導き出します。

これは、私が考えていたよりも賢い人々でなければなりません。これを行うより良い方法はありますか?

4

2 に答える 2

1

新しいオブジェクトは、参加するネットワーク (新規または既存) をどのように認識しますか? 必要なものに応じて、いくつかのアプローチがあります。

最初の方法

たとえば、次のように、毎秒よりも精度の低いタイマーを使用できます。

integer time = llGetUnixTime();
integer channel = time - (time % 1000);

ほぼ同時に rez されたすべてのオブジェクトは、上記のコードによると同じチャネルを持つ可能性がありますが、time % 1000 が 0 または 1000 に近くないことを確認し、その場合はおそらく time % 10000 を使用する必要があります。

2番目の方法

それ以外に、ある種の検出プロトコルを作成できます。例えば:

  1. 新たに rez されたオブジェクトが、ハードコーディングされたコントロール チャネルでこんにちはと言う
  2. エリア内の各ネットワークのメインサーバーは、そのネットワークのチャネル番号で応答します
  3. オブジェクトは、参加したいネットワークを選択します
  4. 誰も応答しない場合、オブジェクトは、コントロール チャネルを何らかの数値 (たとえば +1) だけインクリメントすることにより、独自のネットワークのサーバーになります。
  5. とにかくオブジェクトが独自のネットワークを作成したい場合は、使用中の最大チャネルを +1 増やし、独自のチャネル/ネットワークを作成します。

組み合わせ

もちろん、両方の方法を組み合わせることができます。llGetUnixTime() を使用してチャネルを取得し、こんにちはと言って、サーバーが応答する場合はノードになり、そうでない場合はサーバーになります。また、オブジェクトの rezz における時間のロールオーバーの違いにより、2 つのネットワークが存在することを避けるために、適切な上下のチャンネルをチェックすることができます。

于 2009-03-22T21:20:52.427 に答える
0

あなたのオブジェクトは別のオブジェクトによってレズされていますか? その場合、簡単な解決策は、llRezObject の整数パラメータにチャネル番号を指定することです。rezzed (子) オブジェクトは、on_rez イベントのパラメーターをチャネルとして使用できます。

たとえば、rezzer の親は次のようにします。

integer networkchannel = 3495293;
llRezObject("myobject", rezpos, rezvel, rezrot, networkchannel);

rez された子オブジェクトは次のようになります。

on_rez(integer networkchannel)
{
    llListen(networkchannel, "", NULL_KEY, "");
}
于 2009-06-22T22:34:17.050 に答える