Google app engine 视频游戏的谷歌应用程序引擎排序成本';s高分表

Google app engine 视频游戏的谷歌应用程序引擎排序成本';s高分表,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,我正在考虑创建自己的GAE应用程序来跟踪玩家在我的视频游戏中的高分。我已经创建了一个简单的应用程序,允许我发送和恢复前10名的高分(也就是说,每场比赛只存储10分),但现在我正在考虑如果事情发展的话,成本会增加 假设一个游戏有成千上万的玩家(呵呵,不是我的)。我已经了解了像OpenFeint这样的应用程序如何对分数进行排序,并在包含数千条条目的highscore表中告诉您确切的排名。例如,你可能是19623岁 为了保持简单,我会创建前100个分数表。但如果我真的想存储所有分数并保持分类呢?从数据

我正在考虑创建自己的GAE应用程序来跟踪玩家在我的视频游戏中的高分。我已经创建了一个简单的应用程序,允许我发送和恢复前10名的高分(也就是说,每场比赛只存储10分),但现在我正在考虑如果事情发展的话,成本会增加

假设一个游戏有成千上万的玩家(呵呵,不是我的)。我已经了解了像OpenFeint这样的应用程序如何对分数进行排序,并在包含数千条条目的highscore表中告诉您确切的排名。例如,你可能是19623岁

为了保持简单,我会创建前100个分数表。但如果我真的想存储所有分数并保持分类呢?从数据库查询分数时,简单地对分数进行排序有意义吗?我不这么认为


这些应用程序是如何实现的?

在GAE上,只要对字段进行索引,就可以轻松返回排序查询。如果您的目标只是找到前100个分数,那么您可以按分数对100个实体进行有序查询—您将按顺序获得它们

更难的部分是为查询分配编号。对于前100名,您基本上需要查看返回的100个实体的列表,并在每个实体旁边打印一个数字

如果您需要查找某个特定级别的用户,可以使用光标缩小搜索范围,显示排名为#19623的用户

你不能有效地用它计算出单个实体的等级。为了使用内置索引计算排名,您必须查询所有实体,并找到单个实体在列表中的位置


最懒惰的排名方式是搜索前100名,如果用户在那里,显示他们的排名,如果没有,然后告诉他们他们>100。另一种可能是偶尔进行大型查询以获得分数范围,存储这些分数范围,然后给用户一个较低的准确度(您位于前500名、前1000名等),而不需要准确的位置。

在GAE上,只要对字段进行索引,就可以轻松返回排序后的查询。如果您的目标只是找到前100个分数,那么您可以按分数对100个实体进行有序查询—您将按顺序获得它们

更难的部分是为查询分配编号。对于前100名,您基本上需要查看返回的100个实体的列表,并在每个实体旁边打印一个数字

如果您需要查找某个特定级别的用户,可以使用光标缩小搜索范围,显示排名为#19623的用户

你不能有效地用它计算出单个实体的等级。为了使用内置索引计算排名,您必须查询所有实体,并找到单个实体在列表中的位置


最懒惰的排名方式是搜索前100名,如果用户在那里,显示他们的排名,如果没有,然后告诉他们他们>100。另一种可能是偶尔进行大型查询以获得分数范围,存储这些分数范围,然后给用户一个较低的准确度(您位于前500名、前1000名等),而不知道确切的位置。

标准数据库索引-无论是在App Engine上还是在其他地方-都不能提供一种有效的方法来查找行/实体的排名。一种选择是定期检查数据库并更新当前排名。但是,如果希望立即更新列组,则基于树的解决方案更好。一个是为项目中的App Engine提供的。

标准数据库索引(在App Engine和其他地方)无法提供一种有效的方法来查找行/实体的排名。一种选择是定期检查数据库并更新当前排名。但是,如果希望立即更新列组,则基于树的解决方案更好。一个是为项目中的App Engine提供的。

我们在TyprX类型比赛(GWT+App Engine)中遇到了相同的问题。我们这样做的方式没有经过数百万行,而是存储高分,如下所示:

  class User {

    Integer day, month, year;
    Integer highscoreOfTheDay;
    Integer highscoreOfMonth;
    Integer highscoreOfTheYear;

  }
这样,您就可以通过on query获得每日、每月、每年的高分排序列表。关键是在用户完成游戏后,用他们自己在每个时段的最佳分数更新用户记录

然后我们将结果保存到memcache和voila中


丹尼尔

我们在TyprX打字比赛(GWT+AppEngine)中也遇到了同样的问题。我们这样做的方式没有经过数百万行,而是存储高分,如下所示:

  class User {

    Integer day, month, year;
    Integer highscoreOfTheDay;
    Integer highscoreOfMonth;
    Integer highscoreOfTheYear;

  }
这样,您就可以通过on query获得每日、每月、每年的高分排序列表。关键是在用户完成游戏后,用他们自己在每个时段的最佳分数更新用户记录

然后我们将结果保存到memcache和voila中


Daniel

我会考虑使用异常处理。每天/小时数千个结果中有多少会成为前100名?保留一个最小/最大top-100范围的实体(当然是memcached)。如果分数在范围内,则每个分数都会朝一个方向移动,如果分数不在范围内,则会朝另一个方向移动(任务队列?)。为什么不将99%的不相关工作分流到另一个流程,并且只需要处理100+1个REC,不管您的最终设置是什么,以更改排名。

我会考虑使用异常处理。每天/小时数千个结果中有多少会成为前100名?保留一个最小/最大top-100范围的实体(当然是memcached)。如果分数在范围内,则每个分数都会朝一个方向移动,如果分数不在范围内,则会朝另一个方向移动(任务队列?)。为什么不将99%的不相关工作分流到另一个流程中,并且只需在更改排名的最终设置中处理100+1 REC。

此外,您还可以编写一个CRON作业,将此信息保存到另一个表中。这将使查找变得相当快。非常感谢,这澄清了如何解决这个问题。“最懒”的方法是有用的,但我完全忘记了一个