前段時間一直在重構遊戲裡面的幫戰系統,在重構的過程中幾次都放到了外網去測試,結果出了很多問題,死鎖一次,漏鎖一次(導致coredump)。也正是在這次重構的過程中發現了如何設計健壯的類。
1: 整個的幫戰系統主要是有兩個類,乙個玩家類leaguebattler,乙個戰場類leaguebattlefield,分別記錄各自的資訊;之前的同事在注入進入戰場邏輯、玩家***的邏輯等過程中,隨意讓玩家例項訪問戰場類,我們看下面的例子。
玩家進入幫戰的處理邏輯,玩家在進入戰場時,應該將對應幫派的參戰人數加一。
int leaguebattler::enter_scene()
field->join_number[this->league_id()] ++;
return 0;
}
在玩家***的處理狀態,玩家***時,應該將killer所在的幫派加分。
int leaguebattler::die_process()
field->mark[this->killer.league_id]++;
return 0;
}
類似上面例子很多,玩家的進入或者死亡需要更新戰場資訊的時候,我之前的程式設計師居然直接去修改幫派戰場資訊的資料,就是在類似上述的乙個函式中造成了宕機。
2: 後來我們對整個設計進行了重構,重構之後第二個例子變成了這個樣子。
int leaguebattler::die_process()
field->update_mark_by_league(this->killer->league_id());
return 0;
}
int leaguefield::update_mark_by_league(int league_id)
這樣就避開了兩個類之間的相互訪問對方資料。類設計的乙個原則就是對自己資源的絕對控制,不能被隨意訪問,一方面是容易維護、另一反面就是不會出現coredump的問題。
不會出現諸如由於漏鎖引起的coredump等問題。
C 類設計的一些心得
前段時間一直在重構遊戲裡面的幫戰系統,在重構的過程中幾次都放到了外網去測試,結果出了很多問題,死鎖一次,漏鎖一次 導致coredump 也正是在這次重構的過程中發現了如何設計健壯的類。1 整個的幫戰系統主要是有兩個類,乙個玩家類leaguebattler,乙個戰場類leaguebattlefield...
C 的一些心得
一 sqlite sqlite,是一款輕型的資料庫,是遵守acid的關聯式資料庫管理系統,它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它占用資源非常的低,在嵌入式裝置中,可能只需要幾百k的記憶體就夠了。它能夠支援windows linux unix等等主流的作業系統,同時能夠跟很...
模型動畫系統設計的一些心得
模型動畫系統設計的一些心得 模型系統是乙個渲染引擎裡的重要組成部分。它的質量直接關係到引擎的渲染效率,和開發效率。我覺得評價乙個模型系統主要包含兩個方面 一 演算法。演算法這東西其實是挺透明的。網上到處可以找到這些東西的資料。其中比較有用的技術有 骨骼動畫,表情動畫,材質動畫,布料 柔體 系統等。這...