Webベースのゲームがプレイヤーのリソースを頻繁に更新できるようにするためのテクニックは何ですか?


8

ずっと前に、ユートピアと呼ばれるこのWebベースのゲームがありました(そして、私はそれがまだ存在していると確信しています)、ターンは1時間ごとです。新しいゴールド/ランバーまたは1時間ごとではありません。

新しいWebベースのゲームの中には、1分あたりのように、より細かい解像度でリソースが増加するものがあります。つまり、プレイヤーの食料生産率が1分あたり5であるとします。プレイヤーは1分ごとに食料の量を増やします。CRONジョブを常に設定してSQLデータベースを更新するのが賢明かどうかはわかりません。SQLデータベースを更新するのは、Webベースなので、彼らが使用しているものと想定しています。たぶん、私は毎分間違っています。

それらのWebベースのゲームはどのようなテクニックを使用していますか?編集に追加:そして、データベースは本当に負荷を処理できますか?

回答:


7

生産率、ベースリソースレベル、最終更新のタイムスタンプを保存できるように思えます。次に、実際のリソースレベルを知る必要があるときはいつでも、生産率に経過時間を掛けることができます。

実際のリソースレベルが変更されるたびに、基本レベルを更新します。生産率が変化するたびに、ベースレベルを実際のレベルに、タイムスタンプを現在の時間に更新します。

この方法では、すべてのプレーヤー(おそらく現在ログインしていないものを含む)を毎分更新する代わりに、実際にプレーヤーによって使用されている行のみを更新します。

(ゲームが1分間に1回「ティック」する場合、ある種の「ターン数」が実際のタイムスタンプよりも優れていると思います。)

このシステムの副次的な利点は、データベースを更新し、値を変更せずに値を予測するために使用されるのと同じロジックを使用できることです-必要な情報のみをクライアントに送信し(毎分更新するのではなく)、予測するクライアントの値。


3
これは実際には、場合によっては複雑な数学の理解を必要とします。お金で利息を稼ぐことを検討してください。1か月に1回の利息を1%追加することは、1年に1回の利息を12%追加することとは異なります。2番目の例では、特定の分にイベントが発生する可能性が10%である場合、10分後に発生する可能性は100%ではありません。興味深いことに、これは人々が他のゲームで目にする物理問題の非常に遅いデモであ​​り、同じ方法を使用してそれらに対処できます。固定タイムステップを使用し、「追いつく」ために必要なだけ実行します。
Kylotan

7
カイロタン、私は複利と複数の確率を複雑な数学として分類しません。:P
共産ダック

1
妥当なポイントです。しかし、ゲームにノンリニアリソースプロダクションを実装するすべての人が、それがどのように機能するかを理解してほしいと思います;)
Andrew Russell

2
ただし、古い定期的な更新を使用している場合は必要ありません。それが私が直面している問題全体です。この方法を使用すると、以前は可能でなかった新しい潜在的なエラーが発生します。
カイロタン

2
反復プロセスを使用して、すべてが正しく適用されることを確認できませんか?プレーヤーがログインすると、各リソースが「アクティブ化」され、次のティック時間が現在のシステム時間より後になるまでループでトリガーされます。もう少しリソース集約型かもしれませんが、ほとんどの非線形システムを処理する必要があります。
Lunin

5

一般的に使用される最新のSQLデータベース(MySQL、Postgres、Oracle、MSSQLなど)では、ストアドプロシージャを任意の時間間隔で実行するようにスケジュールできます。これは、このような更新を実行するための非常に軽量な方法であり、それを実行するために外部スクリプトまたはプログラムを呼び出す必要がなくなります。

これにより、外部スクリプトが呼び出すたびに行うのではなく、データベースでクエリを1回だけ最適化できるため、パフォーマンスの観点から非常に役立ちます。もちろん、これは、更新がデータベース独自のスクリプト言語でプログラムできるほど簡単な場合にのみ適用されます。リソースの更新、時間間隔の自動ログアウト、レコードの削除などは、これらのスケジュールされたストアドプロシージャの優れた候補です。

人気のあるゲームは毎秒数十万のクエリを簡単に持つことができるため、データベースで発生している負荷は、ページの読み込み、ゲームエンジンの更新などから99.9%に達する可能性があります。少数のクエリ(テーブルの大部分に影響するクエリ)を1分程度実行すると生じる負荷と比較すると、負荷は問題になりません。つまり、データベースによってインデックスが作成された値を更新しない限りです。パフォーマンスを心配する場合は、インデックス付きの列を絶対に更新しないでください。


2

アップデートについて:

特定のPHPページに頻繁にアクセスするCRONジョブを使用する人もいます。

一部はCRONジョブを使用し、今回は特定のプロセスを実行しています。

別のアプローチは、「ジャストインタイム」の更新を行うことです。ページがロードされるたびに、保留中の更新を実行し、その時点でそれらを実行します。これは通常、CRONジョブまたは長時間実行プロセスを実行できない場合に行う必要があることです。

最後に、他のユーザーはWebアプリケーション全体を1つのプロセスとして実行しているため、時間になるといつでも更新できます。

メモリにデータを保存できるため、そのオプションが利用可能な場合は、最終的なシステムが最適です。従来のSQLデータベースに書き込む必要がなく、RAMのデータを変更するだけの場合は、毎分数千のプレーヤーを更新するのは簡単です。

ただし、その贅沢がない場合は、何らかのキャッシュを使用できます。memcachedのようなものは、(ホスティングに応じて)1つのオプションであり、これはメモリとデータベースの中間点です。一時的な値をmemcacheに保存し、どうしても必要な場合にのみDBに保存できます。

memcacheと従来のSQLデータベースの間には、他のオプションがあります。さまざまなキー/値ストアまたはドキュメントストア:MongoDBCouchDB、AmazonまたはGoogleオファリングなど。包括的な用語NoSQLの下にあるすべてのシステム。これらは通常、一般的なクエリ機能を提供せず、常に従来のデータベースと同じ安全性を保証しませんが、多くの場合、操作ははるかに高速です。(彼らがあなたのために少ないことをしているので、それはそれほど驚くべきことではありません。)

しかし、これはすべて、通常のデータベースが負荷を処理できないことを前提としています。実際、ほとんどの場合それはおそらく可能です。リソースレベルを上げるために毎分10,000回のUPDATE呼び出しを発行する必要がある場合、他のすべてのものを追加し始めると、それはあまりスケーラブルではありません。しかし、1つのSQL呼び出しで全員のリソースを更新するようにそれを変更すると、突然、事態はよりポジティブに見えます。したがって、特定の機能がより効率的な形式で実装できることが多いため、特定の機能のコストを過大評価しないでください。


0

私はKISSを支持しています:「Keep It Simple、Stupid!」

私はcronジョブが機能しない理由を私は見ていません、そして有利な点は、安価なWebホスティングオプションでは多くの場合、直接コマンドを実行できないことですが、cronコマンドを実行できます。したがって、高価な専用サーバーは必要ありません。

また、cronコマンドまたはテキストブラウザーを使用して、PHPまたはお好みの言語で更新コードを実行することもできます。cronジョブの構成の手順には、独自のページを一定間隔でpingするために使用できるコマンドの例がいくつかあります。wget --spider http://yoursite.com/secretphppage.phplynx


私は、数百人のユーザーのデータを一度に更新する毎分実行されるCRONジョブの方が心配だと思います。
Extrakun

1
最近のデータベースでは、1分間に数百のデータセットへの更新は問題ありません。クエリがどのように見えるかはわかりませんが、影響を受ける数千の行があっても、1回の「UPDATE」呼び出しで問題なく実行できます。
bummzack

そして、どの世界でcronジョブは「シンプル」と見なされますか?あなたがシステム管理者でないなら、あなたはおそらくその設定ファイルを見るだけで怒るでしょう...
o0 '。

ウェブホストの世界では、(通常)SSHアクセスを提供しないため、Cronへの簡単なインターフェースを提供する必要があります。私のウェブホスト(Lunarpagesのは)CPanelのを使用し、私は非常に使いやすい、それを見つける:img822.imageshack.us/img822/7022/easycron.png
Ricket

0

プラネタリオンのクローンのコードを見た覚えがあります。すべてがPHPですが、ティッカーコードは未加工のCです-C MySQLバインディングを使用しています。データモデルは非常に単純だったので、更新は非常に速く行われます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.