0

ビデオゲームでプレイヤーのハイスコアを追跡するために、独自の GAE アプリを作成することを検討しています。トップ 10 のハイスコア (つまり、ゲームごとに 10 のスコアのみが保存される) を送信および回復できる単純なアプリを既に作成しましたが、現在、状況が大きくなった場合のコストを検討しています。

ゲームに数千人または数百万人のプレイヤーがいるとしましょう(へへ、私のものではありません)。OpenFeint のようなアプリケーションがスコアをソートし、何千ものエントリを含むハイスコア テーブルで正確なランクを表示する方法を見てきました。たとえば、あなたは #19623 かもしれません。

簡単にするために、上位 100 のスコア テーブルを作成します。しかし、本当にすべてのスコアを保存して整理したい場合はどうすればよいでしょうか? スコアがデータベースからクエリされたときにスコアを単純にソートすることは理にかなっていますか? 私はそうは思わない...

そのようなアプリケーションはどのように実装されますか?

4

4 に答える 4

1

例外処理を使用することを考えます。毎日/毎時間、何千件の結果がトップ 100 スコアになりますか? 最小/最大の上位 100 の範囲のエンティティを保持します (もちろん memcached)。来る各スコアは、範囲内にある場合は一方向に進み、そうでない場合は別の方向 (タスク キュー?) に進みます。関連性のない作業の 99% を別のプロセスに振り分けて、ランキングを変更するための最終的な設定が何であれ、100+1 件のレコードを処理するだけでよいのではないでしょうか。

于 2012-05-25T16:08:54.370 に答える
1

標準のデータベース インデックス作成 (App Engine と他の場所の両方) は、行/エンティティのランクを見つける効率的な方法を提供しません。1 つのオプションは、データベースを定期的に調べて、現在のランクを更新することです。ただし、ランクをすぐに更新する場合は、ツリー ベースのソリューションの方が適しています。1 つはapp-engine-ranklistプロジェクトで App Engine 用に提供されています。

于 2012-05-25T05:51:38.473 に答える
1

TyprX のタイピング レース (GWT + App Engine) でも同じ問題がありました。何百万もの行を経由せずに行った方法で、次のようにハイスコアを保存しました。

  class User {

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

  }

そうすることで、クエリを使用して、日別、月別、年別のハイスコアの並べ替えられたリストを取得できます。重要なのは、ユーザーがゲームを終了するたびに、各期間の最高スコアでユーザーの記録を更新することです。

次に、結果を memcache に保存して出来上がりを追加しました。

ダニエル

于 2012-05-25T09:04:29.960 に答える
1

GAE では、フィールドにインデックスを付けている限り、並べ替えられたクエリを簡単に返すことができます。上位 100 のスコアを見つけることが目標である場合は、100 のエンティティに対してスコアごとに順序付けされたクエリを実行できます。それらは順番に取得されます。

https://developers.google.com/appengine/docs/python/datastore/queryclass#Query_order

難しいのは、クエリに番号を割り当てることです。上位 100 については、基本的に、返された 100 エンティティのリストを調べて、それぞれの横に数字を出力します。

特定のランクのユーザーを見つける必要がある場合は、カーソルを使用して検索を絞り込み、ランク #19623 のユーザーを指定できます。

これで効率的にできないことは、単一のエンティティのランクを把握することです。組み込みのインデックスを使用してランキングを把握するには、すべてのエンティティに対してクエリを実行し、その個々のエンティティがリスト内のどこにあるかを見つける必要があります。

ランキングを行う最も怠惰な方法は、トップ 100 を検索するようなものです。ユーザーがそこにいる場合はランキングを表示し、そうでない場合はランキングを表示し、100 を超えていることを伝えます。別の可能性は、スコアを取得するために時々大きなクエリを実行することです。範囲、それらを保存し、正確な場所を持たずに、ユーザーにあまり正確ではありません(上位500位、上位1000位など)。

于 2012-05-24T15:16:05.083 に答える