ゲームランキングの実現

1371 ワード

ゲームランキングの実現
私はゲーム会社の猿です.ゲームサーバーの開発をしています.最近会社は新しいC++プログラマーを募集するつもりで、私は普通1つのよくある機能を聞いて、1万人のランキングはどのように実現します.
「1.データベースから直接読み込む、2.hashテーブル、3.リング配列、4.この問題をよく考えてみます」など、多くの答えが得られました.
これらの答えには満足していません.ゲームロジックの開発に従事している人は、ランキング機能が基礎機能であり、「優秀」なC++プログラマーの本能から、どのように実現するかをよく考えなければならないからです.この機能が表面にとどまると、心理的にどのようなデータ構造を使っているのか、肝心な問題でうそをついているのではないかと推測され、私はこのような同僚と仕事をしたくないかもしれません.私は10分以内に良い答えを出すことができないすべての人を殺すのではなく、「正しい本能反応」を得たいと思っています.考えの方向が正しいだけです.
実行可能で性能の良い実装方法を示します.
ランキングという機能は、ベースコンテナが配列に違いない、vector.ランキングでは「順位に基づいて人を見つける」という特性をサポートしているからです.他の容器ではこのような特性はサポートされていません.
vectorにはPlayerポインタと、ランキングで使用されるkey(例えば、ランキングのkeyは「レベル」「0 xffffff-タイムスタンプ」の組み合わせ)が保存されています.
Player構造にはランキング順位が保存されている.
                                          

         key1, Player * p1            p1 {myrank : 1, ...}
         key2, Player * p2            p2 {myrank : 2, ...}
         key3, Player * p3            p3 {myrank : 3, ...}
         key4, Player * p4            p4 {myrank : 4, ...}

サーバが起動すると、上位1万人を整理し、クイックソート、スタックソート、挿入ソート、バブルソートを使用しても構いません.
ゲーム中、プレイヤーデータが変化してランキングを更新する必要がある場合は、myrankによってプレイヤーの対応するランキング位置を見つけ、順番に上に泡を立てて比較し、そのプレイヤーデータを移動するとともに、移動されたプレイヤーmyrankを更新すればよい.これで新しいランキングが得られました.
極端な状況は存在しないが、最下位のプレイヤーはジャンプ性で1位にジャンプすることはできず、徐々に上に移動するので、泡を立てる方式では性能に影響を与えない.
転載先:https://www.cnblogs.com/liutengda/p/4434077.html