Re: [程式] online game 的 data base 存些什麼?

看板GameDesign (遊戲設計)作者 (雷穆爾德‧小一)時間15年前 (2009/09/25 09:21), 編輯推噓6(6011)
留言17則, 7人參與, 最新討論串2/2 (看更多)
※ 引述《etrexetrex (moonet)》之銘言: : 這個問題困擾我很久了 : 比方說 online game 的 DB 應該要存玩家身上有哪些道具 : 那麼我一直丟撿東西,資料庫中的資料就應該會隨之改變 : 不過這樣的頻率不會太高嗎? : 我之前寫過一個網路蜘蛛 (ASP.NET + SQLserver) : 每隔幾秒存取一次資料庫 : 幾分鐘之後就壞了 : 我猜壞掉的原因是資料庫擋了頻率過高的存取 : 所以那種 online game 人物狀態、道具一直改變的遊戲 : 資料庫都存些什麼? 大致上來說 其實資料庫的存取主要只有在使用者登入與離線這兩個時機而已 伺服器程式對於每一個已登入的玩家都會個別建立一個實體物件 物件的每個成員變數都對應資料庫中的每一項欄位 在使用者登入時就會把所有資料一次從資料庫載入對應的成員變數中 之後遊戲中的變動都是在實體物件中操作 直到偵測到使用者已離線(無論是自行登出還是意外斷線) 或者是伺服器準備要關機 就把所有資料一次寫回資料庫中 當然這中間還有些技術細節要處理 比方說為了避免伺服器意外停機 可能每隔一段時間就要進行一次遊戲資料的儲存動作 (這也是有時候會出現回溯的原因...如果伺服器剛好在下次儲存之前意外停擺) 但絕對不會是遊戲資料一有變動就儲存在資料庫中 那樣作對資料庫的負荷太大 -- 「我從來都不喜歡 MFC,從一開始就不喜歡,我認為它的設計不良, 且幾乎不能算是物件導向。」 - Charles Petzold http://reassert.blogspot.com -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.41.81 ※ 編輯: remmurds 來自: 114.32.41.81 (09/25 09:22)

09/25 10:09, , 1F
但就算幾秒存取一次db 也不可能幾分鐘就壞掉吧 哪有這
09/25 10:09, 1F

09/25 10:10, , 2F
麼遜的db 不過你提得做法是必要的
09/25 10:10, 2F

09/25 10:46, , 3F
那網路蜘蛛之類的也是用相同的方法嗎? 避免存取資料庫
09/25 10:46, 3F

09/25 12:50, , 4F
這篇算是很標準的業界作法
09/25 12:50, 4F

09/25 20:42, , 5F
在幾個critical moment作DB access就夠了
09/25 20:42, 5F

09/25 20:42, , 6F
像拾取物品 首領擊殺 遊戲幣變動
09/25 20:42, 6F

09/25 20:43, , 7F
其他一些回宿也無所謂的 像你殺了隻10exp的怪就....
09/25 20:43, 7F

09/25 20:45, , 8F
當然定時存取也是有必要的 不過不用太頻繁
09/25 20:45, 8F

09/25 20:45, , 9F
另外每次存取也不見得需要全部資料都sync 可以sync部分
09/25 20:45, 9F

09/25 20:46, , 10F
這些都是讓DB Overhead安全的減少的方法
09/25 20:46, 10F

09/26 00:22, , 11F
跟玩家道具相關的動作(花錢得來的)每筆都會寫至DB 並且log
09/26 00:22, 11F

09/26 22:13, , 12F
另一種作法是先寫至 local端 db 如 SQLite再定時寫回主
09/26 22:13, 12F

09/26 22:14, , 13F
要的 DB 上
09/26 22:14, 13F

09/27 23:31, , 14F
都用DB下SQL 會很花HD rw嗎? 我記得mySQL/SQLite都有buff
09/27 23:31, 14F

09/27 23:32, , 15F
你不下flush 就終止connect 會有幾筆data來不及存入~
09/27 23:32, 15F

09/27 23:34, , 16F
如果覺得DB負荷太大 那用script lan都支援的關聯陣列作??
09/27 23:34, 16F

10/08 15:21, , 17F
他應該是 connection 爆了,所以要依段時間才恢復
10/08 15:21, 17F
文章代碼(AID): #1Al1iRBO (GameDesign)
文章代碼(AID): #1Al1iRBO (GameDesign)