作者remmurds (雷穆尔德‧小一)
看板GameDesign
标题Re: [程式] online game 的 data base 存些什麽?
时间Fri Sep 25 09:21:23 2009
※ 引述《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)
1F:推 asoedarren:但就算几秒存取一次db 也不可能几分钟就坏掉吧 哪有这 09/25 10:09
2F:→ asoedarren:麽逊的db 不过你提得做法是必要的 09/25 10:10
3F:推 etrexetrex:那网路蜘蛛之类的也是用相同的方法吗? 避免存取资料库 09/25 10:46
4F:推 realmeat:这篇算是很标准的业界作法 09/25 12:50
5F:推 Killercat:在几个critical moment作DB access就够了 09/25 20:42
6F:→ Killercat:像拾取物品 首领击杀 游戏币变动 09/25 20:42
7F:→ Killercat:其他一些回宿也无所谓的 像你杀了只10exp的怪就.... 09/25 20:43
8F:→ Killercat:当然定时存取也是有必要的 不过不用太频繁 09/25 20:45
9F:→ Killercat:另外每次存取也不见得需要全部资料都sync 可以sync部分 09/25 20:45
10F:→ Killercat:这些都是让DB Overhead安全的减少的方法 09/25 20:46
11F:→ airzone:跟玩家道具相关的动作(花钱得来的)每笔都会写至DB 并且log 09/26 00:22
12F:→ airzone:另一种作法是先写至 local端 db 如 SQLite再定时写回主 09/26 22:13
13F:→ airzone:要的 DB 上 09/26 22:14
14F:推 softwind:都用DB下SQL 会很花HD rw吗? 我记得mySQL/SQLite都有buff 09/27 23:31
15F:→ softwind:你不下flush 就终止connect 会有几笔data来不及存入~ 09/27 23:32
16F:→ softwind:如果觉得DB负荷太大 那用script lan都支援的关联阵列作?? 09/27 23:34
17F:推 PeacockLiu:他应该是 connection 爆了,所以要依段时间才恢复 10/08 15:21