2

网络中的对等节点是否有一个通用或已建立的算法来决定一个唯一的“网络通道”(或任何其他形式的半秘密标识符)?

我工作的环境是SecondLife。我试图弄清楚如何让许多相同的对等脚本对象就允许它们形成网络的“通道”编号达成一致,而不会干扰同类对象的其他现有网络。

所有对象大致在同一时间被实例化,并且可以访问(公共)系统时间。

我想到的方法:

  1. 基于实例化时间。Channel 是从 unix 时间派生的(通过 md5)。问题是“大致相同的时间”部分。它们可能会在新的一秒前被实例化。

  2. 随机等待。让对象等待一个随机量,并宣布一个(随机生成的)通道号,该通道号由第一个唤醒的对象决定。问题是,系统的时间粒度较低,在处理公告之前可以唤醒多个对象。

  3. 结合 1 和 2。等待一个随机量后宣布一个高分辨率的时间戳,并从最低宣布的时间戳导出频道。

这一定是比我想象的更聪明的人。有更好的方法吗?

4

2 回答 2

1

新对象如何知道要加入哪个网络(新的或现有的)?根据您的具体需要,有多种方法。

第一种方法

您可以使用比每秒更精确的计时器,例如:

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

根据上面的代码,几乎同时重新调整的所有对象都可能具有相同的通道,尽管您可能希望确保 time % 1000 不在 0 或 1000 附近,并且在这种情况下可能使用 time % 10000 。

第二种方法

除此之外,您可以创建某种发现协议。例如:

  1. 新rezzed对象在硬编码控制通道上打招呼
  2. 区域内每个网络的主服务器响应其网络的通道号
  3. 对象选择他想加入的网络
  4. 如果没有人响应,对象将成为其自己网络的服务器,通过将控制通道增加某个数字(例如 +1)
  5. 如果对象无论如何都想创建自己的网络,它将使用的最高通道增加 +1 并创建自己的通道/网络

组合

当然,您可以结合使用这两种方法 - 使用 llGetUnixTime() 派生通道,打个招呼,如果服务器响应成为节点,否则成为服务器。此外,您可以检查适当的较高和较低通道,以避免由于对象 rezzing 的时间翻转差异而产生两个网络。

于 2009-03-22T21:20:52.427 回答
0

您的对象是否被另一个对象重新定位?如果是这样,那么简单的解决方案是在 llRezObject 的整数参数中提供通道号。然后,rezzed(子)对象可以仅使用其 on_rez 事件中的参数作为通道。

例如,rezzer 父级会执行以下操作:

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

和 rezzed 子对象会做这样的事情:

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