2012-10-13 67 views
2

我们都知道的MMO游戏的流行趋势。球员彼此面对面生活。但是在游戏过程中存在SQL插入和查询的巨大流量,低于提高游戏性能C#

  • 给出每页显示12分钟或500个播放器/小时
  • 有平均/最低100场比赛在网上游戏进度表中,我们存储每个玩家移动
    • 12 4播放机的轮比赛可以有48条记录
    • 加上咒语或特殊项目
    • 总共96个每锦标赛或48000每小时记录插入件围绕相同数量的(500名玩家/小时)

在效应初探我刚才的问题(Improve MMO game performance),我改变了架构和我们没有直接写入到数据库中。

而是积累在DataTable所有值。然后,该过程每当DataTable具有100K以上的行(其有时甚至可以在一小时内)写入到CSV格式的文本文件。另一个经常扫描CSV文件的后台应用程序读取任何可用的CSV文件并将信息存储到服务器数据库中。

问题

  1. 我们可以访问数据表存在于游戏应用的从另一个应用程序,直接(它读取数据表并清除已经阅读记录)。为了代替从磁盘写入和读取,我们直接从内存读取和写入。

  2. 是否有更快的是数据表,可容纳大量的数据,但在整理和更新操作相当快的任何方法。因为我们必须频繁地扫描用户名,更新游戏状态(几乎每个插入)。它可以是一个高速缓存工具或快速 扫描/搜索算法甚至CollectionModel。现在,我们使用foreach循环遍历DataTable中的所有记录,并在用户存在时更新行。如果没有,那么我们创建一个新的行。我尝试使用SortedList和班级,但随后它不仅加倍努力,内存使用率增加极大地减慢整体的游戏性能。

感谢

阿文德

+1

一)http://stackoverflow.com/a/981824/284240 –

+1

是否使用了strogly类型化的DataSet或常规'的DataSet/DataTable'?你有没有设置['PrimaryKey'](http://msdn.microsoft.com/en-us/library/system.data.datatable.primarykey.aspx)?然后,您可以非常有效地通过键找到行(http://msdn.microsoft.com/en-us/library/y06xa2h1(v = vs.80).aspx)。 –

+0

这是一个传统的模型。是的,我们有一个主键 – arvind

回答

1

好吧,让我们回答:

  1. 可以在应用程序之间共享对象,使用远程处理 - 但它是慢得多,并且使代码可读性较差。但是,你有另一个解决方案,所以你会继续处理内存。你可以使用MemoryMappedFiles,所以所有的工作将实际上使用内存,而不是磁盘:http://msdn.microsoft.com/en-us/library/dd997372.aspx

  2. 你可以使用NoSQL DB从某种(有很多在那里:Redis,MongoDB,RavenDB) - 所有他们基于键值访问,你应该测试他们的性能。更好的是,这个数据库的一些是持久的,可以用于多个服务器。

希望这会有所帮助。

+0

我正在寻找memorymappedfiles,但我不能有一个新的测试数据库。 – arvind

+0

我会第二次使用像Redis这样可以坚持的快速缓存层,在考虑未来的可伸缩性时,这往往是这种场景中的最佳解决方案 – Milney

1

使用内存缓存会提高你的表现