[wizs] weather_d.c 的群播

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間14年前 (2011/06/23 11:13), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
當處於一般房間時會看到如下訊息.. 豆大的雨滴如水銀洩地般的由空中傾洩而下,一道閃電挾著震耳的雷聲落在大地上. 夜色漸深,寧靜的漫漫長夜開始了。    其群播寫法如下... 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
文章代碼(AID): #1E0gzrqm (mud_sanc)
文章代碼(AID): #1E0gzrqm (mud_sanc)