当前位置: 首页 > 知识库问答 >
问题:

提高MMO游戏性能

潘皓
2023-03-14

我们都知道MMO游戏的流行趋势。玩家面对面直播。

我关心的领域是玩家移动和游戏结果的存储。

通过NPGSQL适配器使用Csharp和PostgreSql v9.0

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

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

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

例如,锦标赛从四名玩家开始,并遵循以下活动

    < li >每个玩家从100点生命值开始 < li >玩家1进行了一次打击(我们参考了一个随机范围内将打击转化为生命值的图表%) < Li > 2号玩家有92点生命值,回击一记轻击,1号玩家有98点生命值

上述两轮比赛现在将进入比赛进度表

ROW Player1HP Player2HP Strikefrom StrikeTo ReturnStrikeHP Round TimeStamp StrikeMethod
1      100       100         0        0            0          0
2       98        92        P1        P2           2          1

为了确定锦标赛是否已经结束,我们检查3名玩家的生命值为零,或者游戏时间已经过了上次进度的规定超时值

我们的牌桌有一个作为tournamentid的主键,它是一个基于玩家id(每个玩家8个)的随机32个字符的代码

还有其他列,如护甲,法力,法术,这些都是为每个玩家设置的,总共有48列-每个玩家12列,以及他们的属性

最后,有一个gameResult表,其中包含锦标赛的结果,tournamentid,tournament_timestamp,gameresult (complete,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)

我也在考虑使用一个后台进程中的夏普,它不断移动过期的锦标赛记录从GamePro<>在另一个数据库,我们有一个服务器免费的游戏负载。

c)我们应该多久运行一次装满邮件的真空吸尘器。

我对新的应用程序开放源代码或toPay,可以提高性能。为了前任。我们使用FastCsvReader http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader来改进服务器日志文件的枚举。

问候阿文德

共有2个答案

班浩皛
2023-03-14

我建议的另一件事是考虑将系统中更新非常频繁的部分转移到VoltDB上,尽管这会带来复杂性成本。这造成了复杂性成本,而你;d可能希望使用他们的商业许可/支持。然而,如果您还具备灾难恢复功能,那么在这种负载下使用主存数据库的好处可能是值得的。PostgreSQL实例可以处理长期数据,而VoltDB可以处理实时数据。

贝滨海
2023-03-14
 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. 

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

 类似资料:
  • 我正在制作一个本地比赛的MMORPG游戏,我已经开始在服务器上工作,我遇到的问题是,我想要一种方法来检测每个玩家看到的其他玩家,这样我就可以将他们周围玩家的信息发送给特定的玩家。 首先,我想到了将一个2d圆形对象附加到玩家对象上,并对数据结构中的每个玩家进行碰撞检查,但这将非常耗费性能,有合适的算法吗?请帮帮我!

  • 利用cocos2d高仿热门消除游戏Dots。动画效果十分流畅,值得下载学习! [Code4App.com]

  • 我正在克隆一只松鸡。我表现得很好:每秒60帧。当时它只有一根柱子/障碍物。我一加上3个,fps就降到了30及以下。那么游戏现在就不能玩了。我知道这与一直在做有关。 以下是代码: 完整的项目来源 还要记住这是真正的未抛光版本,所以代码很难看。我正在寻找提升性能的解决方案。 主类: 框架类别: 支柱/支柱类: Ptica/Brid等级: Util类:

  • 问题内容: 我使用pygame在python中做了一个非常简单的游戏。分数基于玩家所达到的等级。我将级别作为一个名为的变量。我想在游戏开始或结束时显示最高级别。 我会更乐于显示一个以上的分数,但是我看到的所有其他线程都太复杂了,以至于我无法理解,因此请保持简单:我是一个初学者,只需要一个分数。 问题答案: 我建议您搁置。例如: 下次打开程序时,请使用: 它将从磁盘读取。如果需要,可以使用此技术保存

  • 我正在用docx4j做一些测试。我需要做的是将复杂的Word文档(2-3页的文本、表格、项目符号列表、图像)转换成XHTML。

  • 我在我的应用程序中创建了第二个DataSource。 我用HikariDataSource创建了它,因为它断开了连接,所以出现了问题。 现在它没有断开,但是很慢 我的配置如下: 爪哇: 有人能告诉我如何提高绩效吗。 它们是表的小查询,分页约为25条记录,需要4秒钟。 我观察到,查询一个select的200条记录需要46秒,而查询只需要2秒。 以前,它们是千分之一秒。 非常感谢。