2009-03-04 16 views
10

私のゲームでインターネットのハイスコアを実装したいと思います。そして、彼らが持っている場所(トップ100だけではない)にフィードバックを与える。通常のSQLで それは次のようになります。Google App Engineでインターネットのハイスコアを実装する方法

SELECT COUNT(*)をポイント>スコアFROM:WHEREポイントnewUsersPoints

とGQLは

db.GqlQuery似た何かを持っている(「スコアSELECT * FROM >:1 "、newUsersPoints).count()

しかし、count()は1000に制限されているので、私の場合はそれほど役に立ちません。 これを実装する方法はありますか?

私は2つの

ファーストを持っている:

    いくつかの範囲にあり、どのように多くの得点格納
  1. 使用シャーディングカウンタのアイデア(http://code.google.com/intl/pl/appengine/articles/sharding_counters.html) 新しい "表" を作成します(from_points、to_points)

  2. 上記のテーブルからすべてのカウンタを集計します。range.to_points < newUsersPoints

  3. 新しいスコアが db.GqlQuery( "SELECT * FROMスコアポイント>:1 ANDポイント> =:2"および<:3 "、newUsersPoints、range.from_pointsの範囲内のスコアよりもいくつのスコアが大きいか検索してください新しいスコアが、そのカウンターにし、インクリメントである、range.to_points).count()+ sumfrom2

  4. 検索範囲

    スプリットように1000(または999)よりも大きいいるカウンタの範囲
  5. 3. wouldn制限に達する

  6. 新しいスコアをスコア表に追加

これは非常に複雑でエラーが発生しやすいです。スコアを追加する前に、ある範囲とTimeoutを増やすことがあります。 (トランザクションではない)

第二のアイデア:

随時ソートすべてのスコアがポイントによると、彼らに新しいポジションを与える(スクリプトは、私たちはチャンクでそれをしなければならないタイムアウトかもしれません)

(一回毎日?)新しいスコアは我々だけ

db.GqlQuery( "スコアポイント> SELECT * FROM:1 LIMIT 1"、newUsersPoints)やるとなる場所で見つけるために

。に.get()をprecalculated_position + 1

他のアイデア?

答えて

4

このthread on the google-appengine groupはおそらく重要です。また、図書館があると思われます。具体的にはranklistです。

基本的には、シャードされたカウンターに似た何かをしたようです。

5

いくつかのGAEアプリケーションでRankerを実装しました。彼らは何千人もの人々が遊ぶFacebookアプリケーションです。それはうまく動作しますが、私の目的のために、それは一つの大きな欠点を持っている:あなたは、事前に参加者のスコアがで落ちる、その上、最終的な範囲を宣言する必要があるので、これは、2つの理由のために悪いです:。

  1. あなたが持っている場合終わりのないコンテスト、そこでは人々の得点が上限を超えて上昇し続けることができます、あなたはフープしています。コンテストの冒頭に

  2. 誰もがゼロに近い束ねているとき、ranker.pyで使用されるツリー構造は効率的ではありません。木は非常に深くなり、その幅のほとんどを使用しません。

言い換えれば、ranker.pyは、得点が既知の範囲の値に均等にランダムに分散している場合に優れています。他の用途では最適ではありません。

すぐに、より一般的に有用なランキングエンジンを開発したいと考えています。そのスレッドが確実に更新されます。

関連する問題