首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高MMO游戏性能

提高MMO游戏性能
EN

Stack Overflow用户
提问于 2012-10-01 06:52:11
回答 2查看 883关注 0票数 1

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

我关心的领域,是储存玩家的移动和游戏结果。 通过NPGSQL适配器使用Csharp和PostgreSql v9.0 游戏客户端是基于浏览器的ASP.NET,并调用The函数进行所有与数据库相关的处理。

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

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

例如,,一场比赛从四名选手开始,接下来的活动

  1. 每位玩家从100点开始。
  2. 玩家1作出一击(我们指的是一个图表,用来将打击转换为具有随机范围%的命中点)
  3. player 2有92 has,并返回一个轻击,所以player1有98 has。

以上两轮将在游戏进步表中进行,如

代码语言:javascript
复制
ROW Player1HP Player2HP Strikefrom StrikeTo ReturnStrikeHP Round TimeStamp StrikeMethod
1      100       100         0        0            0          0
2       98        92        P1        P2           2          1

要查找比赛是否已经结束,我们检查3名玩家是否有零命中点,或者游戏时间已经过了规定的超时值,从上一次进度开始。

我们的表有一个主键作为比赛,一个随机的32个字符代码基于游戏队(每个玩家8)。

还有其他列,如盔甲、法力、法术,每个玩家都会继续前进,总共有48列--每个玩家12列及其属性。

最后,有一个gameResult表,它有一个锦标赛的结果,包括锦标赛,tournament_timestamp,游戏(完全,PlayerSurrender,InvalidSession,SecurityHack,TimeOut),winnerPlayer,playerMetrics,rowIDfrom,rowIDto

查询

我的问题集中在减少游戏数据库或Sql查询的负载上。

a)如何检测玩家是否同时登录并打开两个游戏会话,但不需要引用数据库或使用Sql

b)如何控制GameProgress表中记录的激增。这样玩家就能更快地做出反应。服务器在高峰时间或1000名玩家在线时开始滞后

代码语言:javascript
复制
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 .的疫苗?

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

问候阿文德

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-01 07:17:36

代码语言:javascript
复制
 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个服务器,do (userId % 10)可以获得用户注册/注销的服务器的Id。

这样,您只在内存中进行这些检查,并在服务器之间调用。您可能需要一个超时/刷新调用,以便断开连接的用户或崩溃的服务器不会永远保持用户登录。

代码语言:javascript
复制
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将后置数据库切换到使用SSD存储

#2将整个进程提升到内存中,而不使用数据库进行实时工作。

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

#4使用多个数据库并在其上分发用户

#5 ..。

代码语言:javascript
复制
Our table has a primarykey as tournamentid a random 32 character code on basis of
playerids. 

一个随机生成的主键是非常糟糕的实践imho。使用序列,否则任何东西都保证是唯一的。如果您的随机代码不够随机,您将得到非常令人讨厌的错误。每个游戏只需要生成一次,所以这不是性能瓶颈。

票数 2
EN

Stack Overflow用户

发布于 2012-10-02 04:28:00

另一件我建议的事情,尽管它很复杂,但代价是考虑将系统中经常更新的部分移到类似VoltDB的地方。这会带来复杂的成本,您可能会想要使用他们的商业许可证/支持。但是,在这种负载上使用主内存db的好处可能是值得的,前提是您也具有灾难恢复功能。然后,您的PostgreSQL实例可以处理长期数据,而VoltDB可以处理实时处理.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12668680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档