Re: [閒聊] 碎碎念
聊一下我的經驗,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
推
08/16 16:07, , 1F
08/16 16:07, 1F
→
08/16 17:51, , 2F
08/16 17:51, 2F
→
08/16 17:51, , 3F
08/16 17:51, 3F
推
08/16 17:57, , 4F
08/16 17:57, 4F
→
08/18 07:26, , 5F
08/18 07:26, 5F
→
08/18 07:26, , 6F
08/18 07:26, 6F
討論串 (同標題文章)
mud_mars 近期熱門文章
PTT遊戲區 即時熱門文章