c# - 提高MMO游戏性能

标签 c# asp.net postgresql mmo

MMO游戏的流行趋势大家都很清楚。玩家面对面的地方。

My area of concern, is storage of player moves and game results.

Using Csharp and PostgreSql v9.0 via NPGSQL adapter

The game client is browser based ASP.NET and calls Csharp functions for all database related processing

要理解我的查询,请考虑以下场景

我们将游戏进度存储在 postgres 表中。

例如锦标赛开始时有四名玩家和以下事件

  1. 每个玩家开始时有 100 点生命值
  2. 玩家 1 进行打击(我们引用图表将打击转换为具有随机范围 % 的生命值)
  3. 玩家 2 有 92 HP,并轻轻一击,所以玩家 1 有 98 hp

以上两回合现在会出现在游戏进度表中,因为

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 的随机 32 字符代码(每个玩家 8 个)

还有其他的列,例如 armor , mana , spells ,所有这些都会为每个玩家结转,总共有 48 列 - 每个玩家和他们的属性 12 列

最后有一个包含锦标赛结果的 gameResult 表,包含 tournamentid、tournament_timestamp、gameresult(complete、PlayerSurrender、InvalidSession、SecurityHack、TimeOut)、winnerPlayer、playerMetrics、rowIDfrom、rowIDto

查询

My questions are focussed on reducing load on Game database or Sql queries

a) 如何检测一个玩家是否没有同时登录并打开两个游戏 session 而不需要引用数据库或使用 Sql

b) 如何控制 GameProgress 表中记录的激增。让玩家得到更快的 react 。高峰期或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改进服务器日志文件的枚举。

问候 阿温德

最佳答案

 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

假设您使用多个服务器,您在某个地方创建了一个只注册登录和注销的进程。只要两者之一发生,您就会调用它。您可以使用该进程来检查用户是否已经登录。您可以通过在所有服务器上运行它来平衡此进程,并使用一种算法仅对一部分用户使用 serverx。假设您有 10 台服务器,请执行 (userId % 10) 以获取用户注册登录/注销的服务器的 ID。

通过这种方式,您仅在内存中通过服务器之间的调用进行这些检查。可能您将需要超时/刷新调用,以便断开连接的用户或崩溃的服务器不会让用户永远登录。

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. 

恕我直言,随机生成的主键是非常糟糕的做法。使用序列,否则任何东西都保证是唯一的。如果你的随机码不够随机,你会得到非常讨厌的错误。每个游戏只需生成一次,因此它不是性能瓶颈。

关于c# - 提高MMO游戏性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12668680/

相关文章:

c# - 了解获取和设置访问器

asp.net - 显示用于登录 ASP Core 2 的控制台

c# - 在 GridView 中仅显示某些列表对象属性

postgresql - 选择子查询在 Intellij 想法中不起作用

c# - 如何在 ASP.NET Core 中获取 TLS/SSL 相关信息?

c# - 在 c# 中导出到 p12 之前将私钥添加到 X509 证书

c# - 防止 Session.Timeout 扩展

asp.net - 如何忽略身份框架的魔力并仅使用 OWIN 身份验证中间件来获取我寻求的声明?

sql - 选择查询以选择小于或等于 postgresql 中的当前日期的最接近日期

python - 无法将 PostgreSQL 数据库从 docker 连接到 python