提高游戏性能C#

时间:2012-10-13 11:46:52

标签: c# performance caching sortedlist mmo

我们都知道MMO游戏的流行趋势。球员面对面生活。但是在游戏过程中会出现大量的SQL插入和查询,如下所示

  • 每12分钟平均/最少100场比赛或500名球员/小时
  • 在游戏进度表中,我们存储每个玩家移动
    • 4名球员的12轮比赛可以有48条记录
    • 加上大约相同数量的法术或特殊物品
    • 每场锦标赛共96次,每小时48000次记录(500名/小时)

在回答我之前的问题(Improve MMO game performance)时,我更改了架构,而不是直接写入数据库。

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

问题

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

  2. 是否有任何方法比DataTable更快,它可以容纳大量数据,但在排序和更新操作方面却相当快。因为我们必须频繁扫描用户ID,更新游戏状态(几乎每次插入)。它可以是缓存实用程序或快速 扫描/搜索算法或甚至是CollectionModel。现在,我们使用foreach循环遍历DataTable中的所有记录,并在用户存在时更新行。如果没有,那么我们创建一个新行。我尝试使用SortedList和类,但它不仅使工作量增加一倍,内存使用量的增加也大大降低了整体游戏性能。

  3. 感谢

    Arvind的

2 个答案:

答案 0 :(得分:1)

好吧,我们回答:

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

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

  3. 希望这有帮助。

答案 1 :(得分:1)

使用memcache可以提高性能