# re: 游戲服務器中的數據庫異步操作技術和游戲數據的保存機制 回復 更多評論
2010-08-30 13:38 by
基本上不會有人在游戲邏輯線程里放置IO操作的代碼吧,包括網絡和DB。對于玩家的重要操作有時候需要立即存儲。
# re: 游戲服務器中的數據庫異步操作技術和游戲數據的保存機制 回復 更多評論
2010-08-30 15:46 by
# re: 游戲服務器中的數據庫異步操作技術和游戲數據的保存機制[未登錄] 回復 更多評論
2010-08-31 20:57 by
異步是一定的,包括db和io操作。而且在邏輯處理時,并不能保證一定不處理db和io操作,總有些需要即時保存的東西
# re: 游戲服務器中的數據庫異步操作技術和游戲數據的保存機制 回復 更多評論
2010-09-01 09:49 by
1 游戲的數據庫一般分 角色數據庫和賬號數據庫
2 賬號數據庫一般與平臺綁定,通常情況下不會提供給你訪問賬號數據庫的權限,而只會給你提供驗證接口.
3 角色數據庫也不是通常意義的直接從數據庫中讀,通常會有個緩沖,這個緩沖會動態調整保存活躍度較高的玩家數據
4 3中的緩沖通常由角色服務器來提供這樣的功能
5 根據我的經驗,邏輯相關網絡消息派發包很少有做多線程,無論是何種服務器,網絡底層可以這么做.
7 其實數據庫服務器很簡單,個人覺得不用這么麻煩的,看起來很高檔很合理的做法.
8 個人意見,僅供參考.
(PS.我從事網絡游戲研發約5年,相對比較熟悉完成1個服務器構架所需要的方方面面,另外,客戶端略懂)
# re: 游戲服務器中的數據庫異步操作技術和游戲數據的保存機制 回復 更多評論
2010-09-05 11:58 by
@RIC
我覺得可能我的說法有些誤導大家,這篇文章里的架構其實就是一個GAMEDB服務器,里面的邏輯處理就是GAMEDB的邏輯處理。你可以把這篇文章理解成:一個GAMEDB服務器 的實現思路。。。
# re: 游戲服務器中的數據庫異步操作技術和游戲數據的保存機制[未登錄] 回復 更多評論
2010-11-26 17:19 by
這類只讀的異步操作其實是很好處理的了,
游戲里比較糾結的DB操作是:A、B兩個模塊同時發起對某個對象的保存或讀取,這樣很難保證新存的數據被舊的覆蓋或者讀取到得不是最新數據。
如果序列化這些操作,又失去了異步的意義。
# re: 游戲服務器中的數據庫異步操作技術和游戲數據的保存機制 回復 更多評論
2010-12-28 23:55 by
@123
我認為很好解決,
比如一個角色A
在10:30:03的時候,角色A的內存數據被復制出來,提交給異步數據庫線程池,請求執行數據庫寫操作。
10:30:04 角色A修改了內存數據
10:30:05 數據庫寫操作完成。數據庫最新數據是0:30:03的時候的
11:00 玩家下線,角色A的數據再被復制出來,提交給異步數據庫線程池,請求執行。。。
。。。。提交的的數據庫操作的數據,一定要復制新的一份。
# re: 游戲服務器中的數據庫異步操作技術和游戲數據的保存機制 回復 更多評論
2011-03-24 16:39 by
當你的邏輯需要DB返回數據,你的異步DB操作怎么保證下面的邏輯操作繼續工作?沒有數據啊?
# re: 游戲服務器中的數據庫異步操作技術和游戲數據的保存機制 回復 更多評論
2012-03-18 13:14 by
2011-03-24 16:39 by J
當你的邏輯需要DB返回數據,你的異步DB操作怎么保證下面的邏輯操作繼續工作?沒有數據啊?
------------------
回復J:異步讀取數據,函數邏輯不是連續的,要拆成兩個函數來完成,即是靠回調的。請求時會把一個id與sql請求發到db,并把id與函數指針關聯起來。db返回時會返回id與數據,根據db返回的id找到之前關聯的相應的函數指針,再調用之.
這里所說的函數指針真正說法應該是一個Functor,因為被回調的函數中往往需要上一個函數中的參數,Functor的作用就是把上一個函數的局部變量打包到回調函數中使用。
# re: 游戲服務器中的數據庫異步操作技術和游戲數據的保存機制 回復 更多評論
2012-03-18 13:23 by
一個邏輯上的東西拆成2個函數來完成,確實代碼不美觀,不易閱讀。不過好在這部分邏輯較少。大部分數據在玩家上線時已經加載到GameServer內存了。少數像玩家房屋之類的just in time的數據就需要做這樣的回調。不知道誰有更好的方法。歡迎交流