我们都知道MMO游戏的流行趋势。玩家面对面的地方。
我关心的领域是存储玩家动作和游戏结果。
通过 NPGSQL 适配器使用 Csharp 和 PostgreSql v9.0
游戏客户端是基于浏览器的 ASP.NET,并为所有与数据库相关的处理调用 Csharp 函数
要了解我的查询,请考虑以下情况
我们将游戏进度存储在 postgres 表中。
例如,锦标赛以四名玩家和以下活动开始
- 每个玩家一开始有 100 个生命值
- 玩家 1 进行罢工(我们参考图表将打击转换为随机范围 % 的生命值)
- 玩家 2 有 92HP,并且还击,所以玩家 1 有 98HP
上述两轮现在将在游戏进度表中,如
ROW Player1HP Player2HP Strikefrom StrikeTo ReturnStrikeHP Round TimeStamp StrikeMethod
1 100 100 0 0 0 0
2 98 92 P1 P2 2 1
要确定锦标赛是否已经结束,我们检查 3 名玩家的生命值为零或游戏时间已超过上次进度的规定超时值
我们的桌子有一个主键作为锦标赛ID 基于玩家ID的随机32个字符代码(每个玩家8个)
还有其他列,例如护甲,法力,法术,所有这些都为每个玩家结转,总共有48列-每个玩家及其属性为12
最后有一个 gameResult 表,其中包含比赛的结果,带有比赛 ID、比赛时间戳、比赛结果(完成、PlayerSurrender、InvalidSession、SecurityHack、TimeOut)、winnerPlayer、playerMetrics、rowIDfrom、rowIDto
询问
我的问题集中在减少游戏数据库或 Sql 查询的负载
a) 如何检测玩家是否未同时登录并打开两个游戏会话但无需参考数据库或使用 Sql
b) 如何控制 GameProgress 表中记录的激增。让玩家更快得到响应。服务器在高峰时段或 1000 名玩家在线时开始延迟
There is a tremendous flow of sql queries, for ex. even in the current game version
There are average/minimum 100 tournaments online per 12 minutes or 500 players / hour
In Game Progress table, We are storing each player move
a 12 round tourament of 4 player there can be 48 records
plus around same number for spells or special items
a total of 96 per tourament or 48000 record inserts per hour (500 players/hour)
我还在考虑在 Csharp 中使用后台进程,该进程不断将过期的锦标赛记录从 GameProgresstable 移动到另一个数据库,在该数据库中我们的服务器没有游戏负载。
c)我们应该多久运行一次充满 postgres 的 vaccum 。
我对可以提高性能的新应用程序开源或 toPay 持开放态度。例如。我们使用 FastCsvReader http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader来改进服务器日志文件的枚举。
问候阿文德