回答:
ファイルを使用してプレーヤーの位置を追跡するにはどうすればよいですか?
プレイヤーの位置をファイルに書き込みます。たとえば、すべてのプレーヤーを一意の番号(またはGUID)で識別する場合、それをファイル名として使用できます。ファイルに、後で解析できる形式で位置データを書き込むだけです。たとえば、プレーヤー#467239がその(x、y、z)の場所にある場合467239.txt
が含まれます。20, 3, 19
これは、データベースで行うこととそれほど違いはありませんが、この操作ではデータベースは「低速」であってはならず、非常に高速である必要があります(おそらくディスクIOオーバーヘッドまたはIOロックがあるため、ファイルよりも高速です)競合-ファイルごとに複数の位置を保存した場合-ファイルシステムベースのアプローチで)。
おそらく、実行時にプレーヤーの位置を保存するためにDBまたはファイルシステムを使用しようとしていましたか?これを行うべきではありません。
実行時、サーバーでは、他の種類のゲームの場合と同様に、プレーヤーの位置をメモリ内に保持して更新する必要があります。定期的にディスクまたはその他の永続的なストレージに保存できます。たとえば、プレーヤーが休んだとき、保存したとき、ログアウトしたときなどです。
しかし、すべての更新をすべてのプレーヤーのストレージに保存することは不要であり、非常に非効率的です。「大規模な」プレーヤースケールに似たものを処理するのに十分な速度になることはありません。
使用中は、位置はRAM内になければなりません。(例:プレイヤーのキャラクターは世界にいます)DBを操作メモリとして使用することはできません。できますが、これはひどいものになります。
定期的にポジションを保存する必要がありますが、毎回ポジションを保存する必要はありません。
すべてのポジションを同時に保存することも避けます。サーバーがクラッシュした場合に永続性を維持したい場合は、できるだけ頻繁にゲームの空き時間に位置を保存する必要があります。これをバッチで行うだけです。
空き時間があれば30のポジションを節約してください。
クライアントについては。サーバーソフトウェアへの接続を通じて(関連する)ゲーム状態の更新を受信する必要があります。DBからではありません ...それは非現実的で、遅く、悪い、悪であり、力は乱されます。
私のサーバーで行うことは、プレイヤーの方向(ベクトル)と最後の位置を保存することです。プレイヤーに速度がある場合、2秒ごとにプレイヤーの新しい位置を計算します。
クライアントはもちろん独自の位置位置を持ち、新しい方向(ベクトル)をサーバーに送信します。
サーバーは、位置について権限を持ち、クライアントが最後のチェックから特定の距離を移動した場合、位置パケットを送信します(これは、クライアントが同期していない場合、ラバーバンド効果につながる可能性があります)。
もちろん、これはすべてメモリ内で行われます。