网络中的对等节点是否有通用或已建立的算法来决定唯一的“网络信道”(或任何其他形式的半秘密标识符)?
我工作的环境是SecondLife。我试图弄清楚如何让许多相同的对等脚本对象在“通道”号上达成一致,允许它们形成一个网络,而不会干扰同类对象的其他现有网络。
所有对象大致在同一时间实例化,并且可以访问(通用)系统时间。
我想到的方法:
基于实例化的时间。通道是从unix时间导出的(通过md5)。问题是“粗略同时”部分。它们可能会在新的第二个时刻被实例化。
随机等待。使对象等待一个随机数量,并宣布由第一个唤醒的(随机生成的)通道号。问题是,系统具有较低的时间粒度,并且在处理通告之前可以唤醒多个对象。
合并1和2.在等待随机数量后宣布高分辨率时间戳,并从最低公布时间戳中获取频道。
这必须是比我想象的更聪明的人。有没有更好的方法呢?
答案 0 :(得分:1)
新对象如何知道要加入哪个网络(新的或现有的)?根据您的具体需求,有许多方法。
您可以使用比每秒更精确的计时器,例如:
integer time = llGetUnixTime();
integer channel = time - (time % 1000);
根据上面的代码,几乎同时处理的所有对象都可能具有相同的通道,尽管您可能希望确保时间%1000不接近0或1000并且可能使用时间%10000那种情况。
除此之外,您还可以创建某种发现协议。例如:
当然,你可以结合使用两种方法 - 使用llGetUnixTime()来派生频道,比如你好,如果服务器响应成为节点,否则成为服务器。此外,您可以检查适当的更高和更低的频道,以避免因为对象的rezzing时间翻滚差异而拥有两个网络。
答案 1 :(得分:0)
你的物体是否被另一个物体弄脏了?如果是这样,那么简单的解决方案是在llRezObject的整数参数中提供通道号。然后,rezzed(子)对象可以使用其on_rez事件中的param作为通道。
例如,rezzer parent将执行以下操作:
integer networkchannel = 3495293;
llRezObject("myobject", rezpos, rezvel, rezrot, networkchannel);
并且rezzed子对象将执行以下操作:
on_rez(integer networkchannel)
{
llListen(networkchannel, "", NULL_KEY, "");
}