作者laechan (小太保)
看板mud_mars
標題Re: [閒聊] 碎碎念
時間Thu Aug 16 14:08:03 2012
聊一下我的經驗,sanc 有個函數叫 improve_skill 是用在
玩家技能熟練度的增加用的。
那麼理論上,這個函數直接內建在 user.c 是最精簡的做法
,因為玩家的熟練度資料參數是建在 user.c 裡面的,內建
函數就可以直接這樣做..
isk[skname]+=n; // skname 這個技能的熟練度 +n
但是 sanc 以前卻把這個函數建到別的地方,使得實際的呼
叫如下..
"/adm/daemons/user2_d"->improve_skill(me,skname,n);
那麼你就可以想像,玩家在戰鬥中每一次觸發到熟練度的增
加時就得做上面的動作至少一次。
但是它有好處,就是「不容易當」,因為它是一個呼叫外部
物件函數的 code,而依 mud 的設計就是,如果你呼叫一個
外部的東西卻失敗時,程式是會往下繼續執行的。但是,如
果是在一個函數裡面的某一個內部呼叫或計算段落錯誤,它
則是會直接停下的。
void improve_skill(string skname,int n)
{
// 這樣就算底下的東西呼叫錯誤,也不會產生重大錯誤
// 然後還可以試著用 catch 去捕捉錯誤訊息
"/adm/daemons/user2_d"->improve_skill(me,skname,n);
}
void improve_skill(string skame,int n)
{
// 這樣一旦下面的東西出錯(比方 skname 是空白的情況)
// 玩家會失去心跳, 嚴重時還會死機
isk[skname]+=n;
}
一般來說,死機有幾種可能原因..
1.資料 type 錯誤
2.函數遞迴錯誤(特別留意一些 return call_other 的)
3.迴圈設計不良(如 while(true), while(1) )
4.具心跳的物件過多
5.同一時間系統需處理的執行緒過重
.
.
一般來說 mudos 升版, config 檔參數適當配置, 可減少在
lib 面看不出來的 crash 情況出現.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 223.143.100.43
推 eplis:謝謝laechan指導! 08/16 16:07
→ laechan:純經驗談,交流交流~ sanc以前23x人就會不明原因crash,後來 08/16 17:51
→ laechan:換mudos換了幾次後這問題就自動解決了 08/16 17:51
推 eplis:不過我查一下 2.2就沒在更新了.. 08/16 17:57
→ laechan:也可以換開發者,像sanc win版曾經換成 fluffos 過 08/18 07:26
→ laechan:從 v22.2b14 -> fluffos 08/18 07:26