1

現在、iPhone 用の mmorpg を作成しようとしています。iPhone がプレーヤーの位置を 1 秒間に数回要求するように設定しました。これを行う方法は、クライアントが非同期 NSURLConnection を使用して、mysql データベースから位置をロードし、それを json で返す php ページにリクエストを送信することです。ただし、位置が要求されてから実際に読み込まれるまでに約 0.5 秒かかります。これは非常に高いように思えますが、これを引き起こす可能性のある明らかな要因はありますか?

また、これにより、クライアントでのプレーヤーの動きも非常に不安定になります。プレイヤーの動きのぎこちなさを軽減するアルゴリズムや方法はありますか?

4

3 に答える 3

4

データベース クエリを iPhone の外で実行した場合にかかる時間を測定し始めます。

次に、iPhone 以外から同じ http リクエストを送信するときにかかる時間を測定します (たとえば、10 ~ 15 行の C# プログラムでこれを計算します)。

上記のいずれにも重大な遅延が見られない場合は、iPhone 側で改善を行う必要があります。注意すべき点:

  • GPRS/3G のレイテンシはかなり高い

  • GPRS/3G のビット エラー率はかなり高いです。つまり、かなりの数のパケットがドロップされ、tcp が再送信され、遅延がさらに大きくなります。

  • HTTP には多くのオーバーヘッドがあります。

  • JSON は多くのオーバーヘッドを追加します。

    おそらく、メッセージ用のコンパクトなバイナリ形式を考え出す必要があり、HTTP をドロップしてカスタム プロトコルを優先する必要があるでしょう。UDP に戻すことさえあるかもしれません。

上記のポイントは通常は当てはまりませんが、高遅延、低帯域幅、不安定な接続でスムーズなエクスペリエンスを提供する必要がある場合は当てはまります。

  • 少なくとも、リクエストごとに新しい TCP 接続を設定していないことを確認してください。http キープアライブを使用する必要があります。

プレイヤーの動きのアルゴリズムに関する具体的な情報はありませんが、よく使われるのはある種の動きの予測です。

プレイヤーが動いている方向を知っていて、速度が常に一定でない場合は速度を導き出すことができます。これは、時間をかけて補間してプレーヤーの新しい位置を推測し、実際の位置を照会している間に画面上の位置を調整し、調整できることを意味します。クエリの応答を取得すると、実際の位置に戻ります。秘訣は、常に特定の境界内で時間をかけて補間することです。クエリが返したものと比較して予測が少しずれていた場合は、位置をすぐに実際の位置に戻さないでください。少数のフレームで現在の位置と目的の位置の間で補間を行います。

于 2010-02-12T10:06:39.800 に答える
3

サーバー側では、実行を継続し、データベース接続を常に開いたままにするシステムを使用する必要があります。できれば、データベースから常に要求するのではなく、キャッシュすることもできます。

また、更新のたびに新しいHTTPリクエストを作成しないでください。HTTPはリアルタイムの通信には実際には適していないため、HTTPをまったく使用する必要がない場合に最適です。

GPRSのping時間は通常600ミリ秒、3Gのping時間は300ミリ秒、HSPAのping時間は100ミリ秒です。使用されているモードを確認します。一部のデバイス(iPhoneについては知りません)は、高速モードを正当化するのに十分なトラフィックがない場合は常に、省電力の理由でHSPAから通常の3Gにドロップすることに注意してください。

位置に関しては、かなり一般的な方法は、線形予測を適用することです。つまり、サーバーからのデータがまだ利用できない場合でも、キャラクターを現在の速度で現在の方向に動かし続けるようにします。

最も重要なのは、レイテンシーがどこにあるかを確認するためのベンチマーク/プロファイルです。サーバー、ネットワーク接続、またはアプリケーションのいずれかです。

于 2010-02-12T07:30:10.290 に答える
1

プレーヤーの位置を高速にロードすることには欠点があります。

  • サーバーに打撃を与えます。
  • 3G は、低遅延アプリケーションをサポートするためのものではありません

そのため、現時点では必要なショートカットなしで mmorpg が機能しているとは思えません。たとえば、速度と位置に基づいてパスを推定するなどです。特にPHPベースのサーバーでは、ポジションのロードは思うように速くはなりません。

いずれにせよ、モバイル プラットフォーム向けに開発する場合、完全な機能を備えたデスクトップ実装に対して、機能を犠牲にする必要があります。

サーバー全体でなくても、C++ などのより高速な言語で、より重要なもののいくつかを再実装することもできます。

于 2010-02-12T07:36:57.910 に答える