作者laechan (小太保)
看板mud_sanc
标题[wizs] weather_d.c 的群播
时间Thu Jun 23 11:13:54 2011
当处於一般房间时会看到如下讯息..
豆大的雨滴如水银泄地般的由空中倾泄而下,一道闪电挟着震耳的雷声落在大地上.
夜色渐深,宁静的漫漫长夜开始了。
其群播写法如下...
void show_message(string msg)
{
object *obs,env;
int i,to;
obs=users();
to=sizeof(obs);
for(i=0;i<to;i++)
{
env=environment(obs[i]);
if( !env ||env->query("light") )
continue;
tell_object(obs[i],msg);
}
}
目前很多系统都有设置类似如上的 show_message 函数,
如轮盘、大乐透、拍卖会等。
这种写法有个缺点,就是不能频繁呼叫,否则每一次都会
做读取 users()、每一次都会做 for 回圈,系统就会处於
一个常态 loading-some 的状态。
另一个缺点就是,如果 users() 的 size 过大,可能也会
出问题。
目前则有研发出新的群播写法..
void show_message(string msg)
{
object ob;
mixed usr=users();
foreach(ob in usr)
{
if(interactive(ob) && environment(ob))
ob->add_temp("broadcast_msg",msg);
else
ob->set_temp("broadcast_msg","");
}
}
先把欲群播的讯息设在所有玩家的身上,然後更动玩家的
heart_beat 函数...
if(temp_data("broadcast_msg"))
{
tell_object(me,temp_data("broadcast_msg"));
map_delete(temp_data,"broadcast_msg"));
}
这样的好处是分散:
一、在 show_message 函数里头做的是对所有玩家的群播
讯息设定(只 set).
二、然後让玩家自己对自己做讯息的 tell_object.
这样理论上玩家就算 400 人,loading 也不会加重太多,
若是用传统写法,loading 就会跟玩家人数成正比。
(虽然用心跳写法也是会, 但增加幅度不明显)
Belldandy.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 115.82.176.179