タグ付けされた質問 「client-server」

クライアントサーバーモデルは、1つのノード(サーバー)が他のノード(クライアント)に対して何らかのサービスを実行する集中コンピューティングモデルです。

2
これは、MMORPGモバイルゲームに適したアーキテクチャですか?
最近、私は会社のために新しいMMORPGモバイルゲームのアーキテクチャを設計しようとしています。このゲームは、マフィア戦争、iMobsters、またはリスクに似ています。基本的な考え方は、敵(オンラインユーザー)と戦うために軍隊を準備することです。 以前は複数のモバイルアプリに取り組んできましたが、これは私にとって新しいことです。多くの苦労の末、高レベルのフロー図を使用して説明するアーキテクチャを思いつきました。 クライアントサーバーモデルを使用することにしました。サーバーに集中データベースがあります。各クライアントには、サーバーとの同期を維持する独自のローカルデータベースがあります。このデータベースは、マップ、製品、在庫など、頻繁に変更されないものを保存するためのキャッシュとして機能します。 このモデルが適切に配置されているため、次の問題に取り組む方法がわかりません。 サーバーとクライアントのデータベースを同期する最良の方法は何でしょうか? イベントをサーバーに更新する前に、ローカルDBに保存する必要がありますか?集中DBに変更を保存する前に、何らかの理由でアプリが終了した場合はどうなりますか? 単純なHTTP要求は同期の目的を果たしますか? 現在ログインしているユーザーを知る方法は?(1つの方法は、クライアントがアクティブであることを通知するためにx分ごとにサーバーにリクエストを送信し続けることです。 クライアント側の検証は十分ですか?そうでない場合、サーバーが何かを検証しない場合にアクションを元に戻す方法は? これが効率的なソリューションであるかどうか、およびどのように拡張されるかはわかりません。すでにそのようなアプリに取り組んでいる人々が自分の経験を共有できれば、もっと良いものを思い付くのに役立つかもしれません。前もって感謝します。 追加情報: クライアント側は、マーマレードと呼ばれるC ++ゲームエンジンに実装されています。これは、すべての主要なモバイルOSでアプリを実行できることを意味するクロスプラットフォームゲームエンジンです。私たちは確かにスレッド化を達成することができ、それは私のフロー図にも示されています。サーバーにMySQLを、クライアントにSQLiteを使用する予定です。 これはターンベースのゲームではないため、他のプレイヤーとのやり取りはあまりありません。サーバーはオンラインプレーヤーのリストを提供し、バトルボタンをクリックしてバトルを行うことができます。いくつかのアニメーションの後、結果がアナウンスされます。 データベースの同期には、2つのソリューションがあります。 各レコードのタイムスタンプを保存します。また、ローカルDBが最後に更新された日時を追跡します。同期するときは、タイムスタンプの大きい行のみを選択して、ローカルDBに送信します。削除された行にはisDeletedフラグを保持して、すべての削除が更新として動作するようにします。しかし、すべての同期要求について、完全なDBをスキャンし、更新された行を探す必要があるため、パフォーマンスに関して深刻な疑問があります。 別の手法として、ユーザーに対して行われた各挿入または更新のログを保持することもできます。クライアントアプリが同期を要求したら、このテーブルに移動して、どのテーブルのどの行が更新または挿入されたかを見つけます。これらの行がクライアントに正常に転送されたら、このログを削除します。しかし、ユーザーが別のデバイスを使用するとどうなるかを考えます。ログテーブルによると、すべての更新はそのユーザーに転送されましたが、実際には別のデバイスで行われました。そのため、デバイスも追跡する必要があります。この手法の実装には時間がかかりますが、最初の手法が実行されるかどうかはわかりません。

3
マルチプレイヤーゲームでの位置の補間
マルチプレイヤーゲームの帯域幅を節約するために、サーバーティックごとにすべてのオブジェクトを更新するのではなく、各オブジェクトがupdateRateを持ち、このオブジェクトがXサーバーティックごとに更新されることをゲームに伝えます。 オブジェクトの更新メッセージを受け取ったとき、次の更新が来ると予想される時間を計算します。 origin = serverCurrentPosition diff = serverNextPosition - origin arriveTime = now + timeBetweenTicks * updateRate オブジェクトを描画するとき、次の更新までの残り時間を計算し、それに応じて位置を補間します。 step = 100 / timeBetweenTicks * updateRate delta = 1 - step * ((arriveTime - now) / 100) position = origin + diff * delta それは動作します...しかし、図面にはまだ少しのジッターがありますが、私の理論では、スケーリングはある程度のラグを処理する必要があるので、すべてがうまくいくはずです、そうでしょうか? ここでの質問は、これが最良のアプローチですか?実際の遅延を計算に入れる必要がありますか?もしそうなら、どうすればいいですか?私はいくつかの実験を行いましたが、ジッターは悪化しました。

3
リアルタイムマルチプレイヤー用のJavaScriptとPHP [閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新する Game Development Stack Exchangeで話題になるようにします。 2年前に閉店。 JavascriptクライアントサイドとPHP / mysqlサーバーサイドを組み合わせることは、HTML5リアルタイムマルチプレイヤー(小規模)ブラウザーゲームにとって良いアイデアだろうか? 私の技術的な知識は非常に限られており、将来node.jsを学習することを計画していても、学習曲線は今のところかなり大きいです。 私はすでにPHPに精通しているので、はるかに高速に機能すると思います。 私が考えている規模は、当時2〜8人のプレーヤーです。また、クライアントからサーバーへのメッセージ数を可能な限り少なくしようとしています。 格納/処理する値は次のとおりです。 プレイヤー名とID。 XおよびY位置。 健康。 装備アイテム(最大8スロット、おそらくそれ以下)。 アクション(歩行、攻撃、使用など。ただし、一度に1アクション/プレイヤーのみ)。 箇条書きのX、Y座標と軌跡。 ギルド/クラン名。 そして、いくつかの基本的なチャット/メール機能。 私の推測では最良の解決策ではありませんが、ロジックを小さく保つ限り、これは完全に実行可能です。私は正しいですか?

4
リアルタイムマルチプレイヤーゲームに使用するデータベース(RDBMS対NoSQL対BOTH)
データベースを必要とするリアルタイムのマルチプレイヤーゲームに取り組んでいます(プレイヤープロファイル、フレンド、ロック解除、ニュースなどの機能用)。これは標準のPCゲーム(ブラウザベースではない)であり、クライアントサーバーを使用します。建築。私はデータベースを使用するのが初めてであり、過去数日間、白熱した議論につまずいたとき、RDBMS対NoSQLのいくつかの研究を行ってきました。現在、私はNoSQLに傾いていますが、それぞれの使用法(RDBMSとNoSQL)を読んだ後、両方を使用したいと思っています。それは奇妙に思えるかもしれませんが、私の状況を説明させてください。 私のチームは、無制限のmySQLストレージと帯域幅を提供する共有Webホスティングパッケージを持っていますが、唯一の注意点は、一度に25の接続しか開けないことです(共有ホスティングルール)。ニュースの更新を投稿したり、コミュニティ機能(コメント、ファンアートのアップロードなど)をサポートしたりするために、これを自分のWebサイト(間違いなく通常の使用方法)で使用するつもりです。それはすべて大丈夫です-しかし!これは物事が面白くなるところです...私はゲーム内で私のウェブサイトに投稿されたこの同じ情報を表示したいです。これは、Webサイトとゲームの両方でmySQLを使用することを意味します。ニュースの投稿などに加えて、ゲーム内でチャットやサーバーリストなどに使用する予定です。私はその25接続ルールについてほとんど心配しています。 質問#1を尋ねるに至ります:これは機能しますか? これに加えて、NoSQLのパフォーマンスとリアルタイムゲームに適していることについて読みました(間違っている可能性があります。私はここに到達するために巨大なRDBMSとNoSQLのフレーム戦争を経験し、おそらく火傷します)。基本的に、すべてのゲームオブジェクトデータにMongoDBを使用します。 繰り返しになりますが、何らかのコンテキストを提供すると役立ちます。240MBのMongoDBパッケージを無料で提供するホスト(MongoLab)を見つけました。アップグレードが必要になるまで使用します。240MBを考えると、約60,000人のプレーヤーを保存できると計算しました(各プレーヤーが約4KBで、保存される可能性のある他のものを無視する場合)。記憶域、および将来的にもっとお金を払わなければならない場合(ゲームが成功する場合)は問題ではありません。私が現在すべてのゲームオブジェクトデータにMongoDBを使用する唯一の理由は、このゲームオブジェクトデータにアクセスする頻度(プレーヤーが殺されたとき、アイテムを拾ったとき、銃を撃ったときなど)のためです。また、単純なスキーマフリードキュメント(ゲームオブジェクトデータのマッピングを容易にする)も好きです。かつて、 私は自分のWebサイトで同じMongoDBを使用して、プレーヤーのプロファイル情報を表示するつもりです(完全な一貫性は気にしません。ゲーム内の更新からの遅延は問題ありません)。2番目の質問、質問2に進みます。これは良いアイデアですか、それとももっと良い方法がありますか? このゲームは、次のような起動エクスペリエンスを備えています。 クライアントのログイン(MongoDB) クライアントは、チャットルーム(MySQL)のあるゲーム内のホームページにあります。 クライアントはサーバーリストに移動します(MySQL) クライアントはサーバーに接続して再生します サーバーはすべてのプレーヤーの更新を通信します(MongoDB) これは私がそれが機能すると想像した方法です。これはあなたによく見えますか、またはこの計画をどのように改善できるかについての提案がありますか?

2
マルチプレイヤーFPSサーバー側のパフォーマンス
これはMMOのパフォーマンスに関連していますが、質問は帯域幅に関するものです。これはCPUの負荷に関するものです。 node.jsとwebGLを使用して簡単なFPSを作成しました。これは非常にシンプルで、MIDI MazeのBuddyMazeクローンによく似ています。ほとんど何も起きていません。全員が2次元(高さなし)で動き、単純な発射体を発射し、壁にぶつかります。 今、サーバーに複数の接続を行い、すべてのプレイヤーが円を描くように高速で射撃する場合、サーバーがコアを使い果たして速度が低下する前に、ゲームで約15〜20人のプレイヤーを獲得できます。これは、サーバーで30 fpsで実行している場合です。10 fpsでは、約25-30の接続が得られます。これはかなり悪いことです。ゲームにはすぐにもっと多くのことが必要になるからです。これを実現するためには、より多くのプレイヤーにフィットさせる必要があります。 私の兄弟は、同僚のTF2サーバーに関する統計情報をいくつか指摘しました。彼のサーバーは私たちのサーバーよりもスペックが低いですが、TF2を実行します。明らかに毎秒500ティック、コアあたり36ユーザーという非常に複雑なゲームです。また、現在、使用する帯域幅よりもはるかに多くの帯域幅を消費していますが、それ以上下げることはまだ試みていません。 これはどのように可能ですか?サーバーのパフォーマンスをこの程度まで向上させるには、どのようなトリックがありますか?私が知っているいくつかのことは次のとおりです。 サーバーのフレームレートを下げ、クライアントの位置を補間します。いくつかの利点が得られましたが、明らかにTF2サーバーはこれを気にしません。 クライアントでの衝突検出などの高価なことを行い、サーバーで頻繁にそれを検証します。私はまだこれを引っ越していません、今夜にしましょう。それでも、私はそのような大きな利益を期待していません。 計算を最小限に抑えるために、競技場を地域(四分木)に分けます。この機会はまだありません。 node.jsはTF2が使用しているものよりもかなり遅く、この種の高強度タスクには適さない可能性があるという残念な可能性を検討しました。 それはすべてサーバー構成の魔法ですか? それでは、サーバー上で最低限必要なことだけを行いながら、完璧なゲーム体験を維持するための業界の他のトリックは何ですか?「CPU時間を節約するためにクライアントを延期する」と「クライアントを信頼しない」との間に大きな矛盾があります。 更新 プロファイリングは、私がこれまでに発見した唯一のマントラです。コードにいくつかのタイミング関数をすばやくラップし(ありがとう、FP!)、予期しないことを発見しました。データをクライアントにブロードキャストする行為は、実行時間のほぼすべてを占めています。具体的には、その約90%です。さらにテストを行ったところ、この時間はクライアントの数とデータのサイズの両方に依存していることが判明しましたが、データのサイズに大きく依存しています。ユーザー数が20人の場合、全データの代わりに「{}」のみを送信することで、ブロードキャスト時間を90%に24ミリ秒から2ミリ秒以上に短縮しました。ただし、ユーザーが5人のみの場合、ブロードキャストには約0.5ミリ秒かかります。したがって、ここでいくつかの最適化を行う必要があることは明らかです。 最初の最も明らかな改善点は、見通しの確認です。これにより、データを気にする人の数と、関係者に送信されるデータの量の両方が減少します。私が試すことができるこの分野には、ブロードキャスト操作のコストを最小限に抑えることに焦点を当てた他のトリックがありますか?

3
Google App Engineを使用してゲームをクライアント/サーバー化する方法(チュートリアルを探しています。)
(注:これは、SOで私が尋ねた質問の複製です。GameDev<恥の頭をぶら下げて>について一時的に忘れてしまいました。一方が回答されたら、もう一方にリンクします。) 私はバックエンドとしてGoogle Apps Engineを使用して最初のクライアント/サーバーゲームを実行しようとしています(仕様要件)。チュートリアル(Java)を実行しましたが、それはすべてブラウザー中心型のようです。 基本的に、私は(重要ではない)モバイルアプリに次のことを求めています。 ユーザーにゲームアカウントの作成を許可します(Googleアカウントではありません!) そのアカウントでログインします。 「MARCO」ボタンを押して、アカウント識別リクエストをサーバーに送信します。 サーバーから「POLO」応答を取得します。 Webページとしてではなく、データ(JSONオブジェクト、XML-DOMなど)として。 誰かが私にそれを達成するのを助けるために良いチュートリアル/サンプルプロジェクト/詳細なリーディングを教えてもらえますか?私はそれが機能するようになったら、残りのすべてを実行できると確信しています-しかし、「開始ゲートで動かなくなった」問題があり、基本的なアカウントログインを処理できず、非HTMLデータ交換。 ありがとう!

2
クライアント側予測でリアルタイムのランダムな動きを処理する方法
クライアントとサーバーで同じ「物理」ループを実行するリアルタイムマルチプレーヤーゲームを構築しています。私は、本質的なランダムな動きであるステアリング動作「ワンダー」を使用しています。ワンダーアルゴリズムを実行すると、クライアントとサーバーは異なる乱数を生成します。 自然にランダムに見える動きをどのように保つことができるのか疑問に思っていますが、クライアントとサーバーが同じ結論になることを保証する定数を使用します。

1
プレーヤーの速度変更を送信するときにクライアントとサーバーを同期するにはどうすればよいですか?
クライアント側の予測を実装しています。ほとんどの説明は、クライアントが「プレーヤーを1ポジション上に移動する」のようなメッセージを送信することを前提としています。「プレイヤーのベロシティをxに設定」のようなメッセージを送信するとどうなりますか? クライアントでは、サーバーよりも先にプレイ​​ヤーが(クライアント側の予測によって)自分の速度を設定するため、2つが同期しなくなります。この問題は、平均遅延を考慮しても解消されません。 どうすればこれに取り組むことができますか?

2
最終的なWebベースのゲームのエンジンは、Webサービスとして開始する必要がありますか?
私は最近、カードゲーム用のエンジンを書き始めることにしました。私は大規模な「カード」プレイヤーではありませんが、友人がゲームを紹介してくれました(デンマーク語のゲームのスピンです)。 ゲームを3つのセグメントで開発したいと思います。 基本的なエンジン、カード/デッキ/ゲーム状態などを処理します ユーザーインターフェイス(モバイル/デスクトップWebアプリの形式) さまざまな戦略/困難などを伴う人工知能 これらは私の心の中で非常に異なるプロジェクトです...そして私はそれらがすべて長期的にどのように組み合わさるかを見るのに苦労しています。最初は、エンジンを使用してゲームを「プレイ」できるようにしたくもありません。エンジンは主に単体テストによってテストされます。クライアントが存在するまで、プレイテストは開始されません。したがって、ここにはクライアントとサーバーの関係のようなものがあります。 エンジンは非常に大きなパズルのピースです。私が知りたいのは、このエンジンの「パブリックAPI」をどのように開発するかです。 エンジンは非常に基本的なWebサービスであり、クエリを介してRESTful APIに状態を返すことができると考えていましたが、エンジン自体をWebアプリとして開発すると、プログラミングの決定に悪影響を及ぼす可能性があると心配しています。(たとえば、MVCマイクロフレームワークを選択した場合、このAPIは実際にはビューを備えていません... JSONを介してシリアル化されたオブジェクトを返すか、そのための何かです。MVCを次のようなサービスに使用するのは悪いことですか?この? ) 私のもう1つのアイデアは、エンジンは単なるコンソールアプリであり、後でそれとWebアプリの間でデータをパイプ処理するためのある種のブリッジを作成することでした。(ブリッジは実際には何でもかまいません。つまり、Webサーバーとゲームエンジンの両方がIRCサーバーでアイドル状態になり、その状態をチャネルで共有できます。) どのようなアプローチをとりますか(Webサービスとして開発するか、スタンドアロンアプリケーションとして開発して後でブリッジする)、そしてその理由は何ですか? ありがとう、ロビー。 編集:これはゲーム開発に属していると思います。わかりやすくするために、カードゲームエンジンを作成します。エンジンのAPIを公開して、将来的にWebクライアントやAIクライアントと統合できるようにする最善の方法を見つけ出そうとしています。 私はここにもアカウントを持っていなかったので、どうも:)

2
リアルタイムゲームに最適なサーバーアーキテクチャは何ですか?
私は何千人ものプレイヤーをリアルタイムで保持できるリアルタイムゲームを開発しています(FPSなど。最大1秒のラグ)。これに最適なインフラストラクチャは何でしょうか? 私のアイデアは、2つのサーバークラスターを使用することでした。1つはサーバーエンド(すべてのコンピューティング側)用で、もう1つはデータベースエンド用で、各クラスターに対してロードバランサーが「責任を負います」。1つのメインサーバーがユーザーからの要求を受信し、ユーザーがこれを実行できる関連サーバーのIPアドレスを返信します。 データベースクラスターは、データベース間の整合性のためにデータベースレプリケーションを使用します。 地理的なロードバランサーも必要です。最適なレスポンスを得るために、地域のロードバランサーを各ユーザーに割り当てます。 ゲームには.NET + MSSQLを使用しています。 ありがとう!

4
クライアントから受信したGPS位置データを確認する方法はありますか?
この質問への答えは「いいえ」かもしれませんが、それは非常に重要なので、私は質問した方がよいと思います。 これは、世界中のプレーヤーの位置がゲームプレイの中心であるすべてのクライアントサーバーの位置認識ゲームで問題になるはずです。クライアントから取得される位置データが本物であることを確認する方法はありますか(つまり、プレーヤーは実際にそこにあります)。 クライアント/サーバーゲームに取り組んでいる私たちは、クライアントからの情報を信頼してはならないことを知っているため、重要なゲームロジックはすべてサーバー側で実行する必要があります。ただし、位置情報については、クライアントからこれを受け取る必要があります。不正行為を防ぐためにこれを再確認する方法はありますか?

3
Android / iOSターンベースのボードゲーム用のゲームサーバー
現在iPhoneゲームをプログラミングしていますが、オンラインマルチプレイヤーモードを作成したいと考えています。将来的には、このアプリはAndroidデバイスに移植される予定なので、ゲームサーバーを作成する方法を考えていましたか? まず最初に、どの言語を選択すればよいですか?サーバーがobjective-cとJavaで書かれたプログラムの両方と通信できるようにする方法は? 次に、それを効果的に行う方法は?クライアントでソケットを開くとよいですか(2つあります)?どのような情報をサーバーに送信する必要がありますか?クライアントに?

1
シンプルなRPGゲームサーバーを作成するにはどうすればよいですか?[閉まっている]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、ゲーム開発スタック交換のトピックになるようにします。 4年前休業。 私はSprite Kitゲームに取り組んでいます。私はそれを真のマルチプレイヤーゲームにしたいと思います。つまり、ゲームに参加する各人が自分のカメラを持っているということです。プレイヤーが同じゲーム画面を共有するマルチプレイヤーゲームのチュートリアルを見てきましたが、それは私が望んでいることではありません。 プレイヤーが接続するサーバーが必要であることを理解しています。つまり、プレイヤーが接続する「世界」はサーバー上で実行されている必要があります。これは正しいです? このゲームの「ワールド」を実行しているサーバーをどのようにして使用しますか?特定のタイプのサーバーである必要がありますか、それともNode.jsやその他の必要なものを使用できますか?

5
クライアント、中央サーバー、プレーヤー実行サーバー間の認証
私はMinecraftに似たクライアントサーバースキームを使用するオープンソースゲームを開発しています。プレイヤーが独自のサーバーを実行する一方で、アカウントが有効であることを確認する中央認証サーバーを制御します。 クライアントの認証は簡単ですが、サーバーは、資格情報やセッショントークンにアクセスすることなく、ユーザーが有効であることをどのようにして知ることができますか? 例えば: クライアント>認証サーバー:ユーザー資格情報を送信します。 認証サーバー>クライアント:有効なログインの場合、セッションIDで応答します。 その後、クライアントはサーバーに接続できますが、サーバーはクライアントが本人であることを確認する方法がありません。これらのサーバーはプレーヤーによって実行されるため、サーバーの変更とユーザーデータの収集が簡単になります。(信頼できるのは中央認証サーバーのみです) 認証サーバーはTCP接続を受け入れることができますが、この場合HTTPSの方が簡単でしょうか。応答を取得する方が、特に少数の要求に対してのみ、両側でリスナーを確立するより簡単です。

2
MMORPGサーバー側Javaアーキテクチャ
現在ターンベースのMMORPGゲームを制作しています。クライアントはAndroidで実行することになっています。今、私の友人がグラフィックをやっていて、私はゲームのクラス(プレーヤー、武器など)をやっています。さて、戦いが始まると、クラスはインターフェースによって操作できます(実際、私のパートナーにとっては、純粋なインターフェースを操作するようなもので、実装クラスへのアクセスは必要ありません)。 次に、複数のプレイヤーを許可するためにゲームサーバーを導入する必要があります。そして、いくつかの非常に重要な質問が発生します: 1)クライアントにクラスを残さずにゲームモデルをサーバーに完全にコピーしますか、またはサーバーに1つとデバイスに1つ、モデルの2つのコピーを用意して、それらの間の定期的な同期を完了する方が良いですか? 2)クライアントとサーバーのどちらの接続方法を選択しますか(視界内のクライアントはAndroidフォンです)?サーバーに関しては-私はそれを使っていくつかの経験があるjava原因に向けています。しかし、今の質問は-このタスクにはソケットを使用する方がいいですか、それともRESTサービスを使用できますか、それともJava EEサーバーに接続することも可能です。合併症?ゲームはマルチプレイヤーですが、ターン制なので、頻繁に更新する必要はありません。 3)スレッドについてはどうですか?すべてのクライアントは独自のスレッド(ソケットの場合)を持つ必要がありますか? 4)REAL MMORPGサーバーゲームのプログラミングに関する本はありますか???

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