提高MMO游戏性能(Improve MMO game performance)

2019-10-17 06:38发布

我们都知道的MMO游戏的流行趋势。 在这里玩家彼此面对生活。

我关注的区域,是玩家的动作和比赛结果的存储。

通过适配器Npgsql的使用Csharp的和PostgreSQL V9.0

游戏客户端是基于浏览器的ASP.NET和所有数据库相关的调用处理Csharp的功能

要了解我的查询,请考虑以下情形

我们存储在一个Postgres的表的游戏进度。

例如比赛有四名球员和下面的活动启动

  1. 每个玩家有100hitpoints开始
  2. 播放机1罢工(我们指的是一个图表,以打击转化为生命值与随机%量程)
  3. 播放器2具有92HP,并返回一个光吹,所以PLAYER1具有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名球员有生命值为零或者gametime经过从去年进步的规定超时值

我们的表具有的PrimaryKey作为tournamentid上playerids的基础的随机32个字符码(8个用于每个播放器)

还有其他列,比如装甲,魔法,咒语,这都得到发扬光大每个球员,总共有48列 - 12每个球员和他们的属性

最后有有比赛的结果,tournamentid,tournament_timestamp,gameresult(完整,PlayerSurrender,InvalidSession,SecurityHack,超时),winnerPlayer,playerMetrics,rowIDfrom,rowIDto一个gameResult表

QUERY

我的问题是集中在对游戏数据库或SQL查询减负

a)如何检测如果一个球员没有在simutaneously记录并开了两个游戏会话,但不必是指数据库或使用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)

我也在考虑使用C#一个后台进程,一直是从GameProgresstable移动过期的比赛记录到另一个数据库,我们有免费的游戏负载的服务器。

C)多久,我们应该运行真空充分的Postgres。

我打开新的应用开源或toPay,可以提高性能。 对于前。 我们使用FastCsvReader http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader提高服务器日志文件枚举。

对于阿文德

Answer 1:

 How to detect if a player has not logged in simutaneously and opened two game sessions 
 but without having to refer to a Database or using Sql

假设你使用多台服务器你的地方创建一个过程,只有注册登录和注销。 你叫每当两个中的一个发生。 您可以使用过程来检查用户是否已经登录,您可以通过LOADBALANCE这个过程中,例如,所有的服务器上运行,并使用算法来只为用户的子集serverx使用。 假设你有10台服务器,这样做(用户ID%10),以获得用户注册与登录/注销的服务器的ID。

这样,你只能与服务器之间的调用内存做这些检查。 也许你需要超时/ refreshcall使断开崩溃不会影响用户的用户或服务器登录,直到永远。

How to control the surge of records into the GameProgress table. so that players get
response quicker. The Server starts to lag at peak hours or when 1000 players are
online

#1开关的postgress数据库的使用SSD的存储

#2提升整个过程到内存中,不使用实时工作数据库

数据库中的#3更新记录,而不是建立新的

#4使用多个数据库和对他们的用户分配

#5 ....

Our table has a primarykey as tournamentid a random 32 character code on basis of
playerids. 

一种随机生成主键是非常不好的做法,恕我直言。 使用序列,或任何保证是唯一的。 如果您randomcode不是随机的足够你会得到非常讨厌的错误。 你需要生成这种每场比赛只有一次,所以它不是一个性能瓶颈。



Answer 2:

我会建议虽然具有复杂性成本的另一件事是考虑移动,这是非常经常更新,以类似VoltDB系统的一部分。 这就带来复杂性成本,而你; d可能想要去与他们的商业许可证/支持。 然而,在这种负载的主内存数据库的好处可能是值得的,只要你有灾难恢复以及。 然后,您的PostgreSQL实例可以处理长期的数据,而VoltDB可以处理实时处理。



文章来源: Improve MMO game performance