0

私はhttp://www.joemajewski.com/fortressにある「Fortress」というタイトルのこのゲームに取り組んでいます。とにかく、これはブラウザベースのロールプレイングゲームの1つであり、プレイヤーは軍隊を編成し、統計をアップグレードしてリーダーボードで上位にランクインします。

30分ごとにcronジョブが実行され、いくつかの更新が行われます。ゲームの各プレイヤーをループし(参加する人が増えるにつれて自然に上昇し続けます)、特定の統計を更新します。それは皆に1ターン余分に与え、彼らの収入、食物、木、銅、鉄などに基づいて彼らに金を与えます、そしてそれは彼らのランキングを更新します。

それはすべてマンボジャンボです、私は知っています、しかし重要なのは各プレイヤーが彼ら自身のアップデートクエリを持っているということです。私はたった3人のメンバーでスクリプトの時間を計りました:

mysql_query()関数を使用した実行時間は更新のためにコメントアウトされています:〜3.5ミリ秒

mysql_query()関数が正しく機能している実行時間:〜14ミリ秒

ゲームに100人以上の登録メンバーがいると、cronジョブが非常に遅くなるのは明らかに更新クエリです。ゲーム開始から2週間以内に100人のアクティブプレイヤーを獲得したいと思っていますが、多くのプレイヤーが複数のアカウントを作成しているため、2週間後には少なくとも200人のメンバーがいると思います。200の更新クエリに加えて、メンバーの並べ替えとランキングの計算に余分な時間がかかるため、cronジョブの実行には2秒以上かかる可能性があります。

あなたへの私の質問。このようなことをするためのより速い方法はありますか?ループの前後にそれぞれ「STARTTRANSACTION」クエリと「COMMIT」クエリを追加しようとしましたが、3つのメンバーだけでは速度を測定するのは困難です。トランザクションによってスクリプトは良くなりますか、それとも悪くなりますか?これを回避する他の方法はありますか?どんな助けでもいただければ幸いです。

お時間を割いていただき、誠にありがとうございました。

4

3 に答える 3

4

質問の限られた詳細に基づくと、すべてのプレーヤーを個別にループするのではなく、1つのクエリまたはいくつかのクエリですべてのプレーヤーの更新を実行できる可能性があります。

テーブル全体に影響を与える1つのクエリで、ターンを追加し、数式に基づいてゴールドを更新することを検討してください。

つまり、基本的な過度の単純化として:

update Players set turns = turns + 1,
                   gold  = (gold + (income * 100) + (wood * 25) + (copper * 25))

これは役に立ちますか?

ランキングは今どのように計算していますか?

于 2010-07-30T16:23:34.617 に答える
1

私の提案は、テスト環境を作成することです。次に、そのテスト環境に数千行のユーザーデータを入力します。投入するデータの量については、経験則を使用し((What You Expect) + (What You Hope For)) * 2ます。したがって、100人のユーザーを期待し、5000人を獲得することを期待する場合(現実的な希望)、少なくとも10200人のユーザーをテストする必要があります...

したがって、大規模なデータベースを作成し、可能な限り現実的になるように努めますが、それにあまり多くのエネルギーを費やさないでください。そこに着いたら、一度に1つずつクエリを試してください。それぞれを最適化します。次に、単純なPHPスクリプトを作成して、さまざまな遅延で多数のクエリを実行します(query1, sleep 50ms, query2, sleep 100ms, query3, query4, sleep 100ms, etc)。次に、(Apache Bench)などのツールを使用して、abそのスクリプトを同時に実行し、データベース内の問題を探します(ここでのタスクは、DBにストレスをかけることなので、ストレスがない場合は、ストレスがかかるまで押し続けます)。

于 2010-07-30T16:30:43.043 に答える
0

あなたは間違っています。

誰かがユーザーリソースデータにアクセスするたびにリソース量を計算します。誰もアクセスしない場合は、これらのデータを計算する必要はありません。

データが最後に計算された時刻を保存します(lt)。

現在のリソース量は次のとおりです。r2=r+ dr *(now-lt)ここで、 dr-現在の
リソース変更-現在の時間lt-データベースへの最後のr保存が行われた時間。r-dbに保存されているリソース量r2-現在のリソース量

毎回テーブルを更新する必要はありません。データベースからr、dr、ltを読み取り、r2を計算するだけです。

このようにすることで、リアルタイムの量のリソースを取得でき、トウモロコシの仕事はありません。

于 2010-07-30T16:38:10.373 に答える