Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 提高MMO游戏性能_C#_Asp.net_Postgresql_Mmo - Fatal编程技术网

C# 提高MMO游戏性能

C# 提高MMO游戏性能,c#,asp.net,postgresql,mmo,C#,Asp.net,Postgresql,Mmo,我们都知道MMO游戏的流行趋势。玩家们面对面生活的地方 我关心的是玩家移动和游戏结果的存储 通过NPGSQL适配器使用Csharp和PostgreSql v9.0 游戏客户端是基于浏览器的ASP.NET,并为所有与数据库相关的处理调用Csharp函数 为了理解我的查询,请考虑下面的方案 我们将游戏进度存储在postgres表中 例如一场比赛由四名选手开始,随后进行活动 每个玩家以100点生命开始 玩家1进行攻击(我们参考一张图表,将攻击转化为随机范围的生命值%) 玩家2的生命值为92,并返回一个

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

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

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

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

为了理解我的查询,请考虑下面的方案

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

例如一场比赛由四名选手开始,随后进行活动

  • 每个玩家以100点生命开始
  • 玩家1进行攻击(我们参考一张图表,将攻击转化为随机范围的生命值%)
  • 玩家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名玩家的生命值是否为零,或者游戏时间是否超过了上次进度规定的超时值

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

    另外还有护甲、法力、法术等其他列,每个玩家都可以使用这些列,总共有48列,每个玩家及其属性使用12列

    最后是一个gameResult表,其中包含锦标赛的结果,包括锦标赛ID、锦标赛时间戳、gameResult(完成、玩家Urrender、无效会话、安全破解、超时)、winnerPlayer、playerMetrics、rowIDfrom、rowIDto

    查询

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

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

    b)如何控制游戏进程表中记录的激增。这样玩家的反应会更快。服务器在高峰时间或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)我们应该多久进行一次充满博士后的真空测试。

    我对能够提高性能的新应用程序opensource或toPay持开放态度。例如,我们使用FastCsvReader来改进服务器日志文件的枚举

    问候 阿文德

    假设您使用多台服务器,您会在某个地方创建一个只注册登录和注销的进程。当这两种情况中的一种发生时,你就会调用它。您可以使用该过程检查用户是否已登录。例如,您可以通过在所有服务器上运行该进程来实现负载平衡,并使用一种算法仅对一部分用户使用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


    随机生成的主键是非常糟糕的做法。使用序列,否则任何东西都保证是唯一的。如果你的随机代码不够随机,你会得到非常讨厌的bug。你需要每游戏只生成一次,所以这不是一个性能瓶颈。

    < P>我会推荐另一件事情,尽管它有复杂的成本,但是你可以考虑把你的系统的一部分更新得非常频繁,比如VoltDB。这带来了复杂性成本,而你;I’我可能想使用他们的商业许可证/支持。但是,如果您还具有灾难恢复功能,那么在这种负载上使用主存数据库的好处可能是值得的。您的PostgreSQL实例可以处理长期数据,而VoltDB可以处理实时处理。

    对不起!我忘了在primarykey中提到时间戳,它实际上是tournamentid+gamestarttime的组合。我们不生成它,相反,我们只是将所有的玩家ID组合在一起,加上时间戳,它就不会比这个更独特了。SSD对于此类通信是可靠的。Postgres是一个独立于驱动器的DB软件。随机主键列的另一个问题是,它倾向于在索引扫描中更均匀地分配必须点击的索引页。这不一定是件好事。谢谢,我会调查voltDb的。同时,你的建议是把所有的数据都存储在内存中,或者至少是实时比赛的数据,并且只在比赛完成后才保存,这真是太棒了。它将服务器执行速度提高到新的高度。
    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
    
    Our table has a primarykey as tournamentid a random 32 character code on basis of
    playerids.