私は決してC ++であらゆる種類のネットワークコードを実行したことはありません。存在するライブラリすら知りませんが、私のゲームに対する一般的な需要はオンラインリーダーボードです...
では、どのような種類のライブラリを調査する必要がありますか?
私のゲームはマルチプラットフォーム(win、gnu、mac)で、C ++、ClanLib 1.0、Luaを使用しています。また、エンジンはzlibです(そのため、ソースをリリースできない独自のものは機能しません)
私は決してC ++であらゆる種類のネットワークコードを実行したことはありません。存在するライブラリすら知りませんが、私のゲームに対する一般的な需要はオンラインリーダーボードです...
では、どのような種類のライブラリを調査する必要がありますか?
私のゲームはマルチプラットフォーム(win、gnu、mac)で、C ++、ClanLib 1.0、Luaを使用しています。また、エンジンはzlibです(そのため、ソースをリリースできない独自のものは機能しません)
回答:
最初の質問、あなたはどのくらい浮気を気にしますか?リーダーボード用のシンプルなwebappを作成することはおそらく非常に簡単ですが、即座にスパムとして存在しなくなります。curlは、ほぼすべてのクライアントコードに統合できる適切な非同期HTTPライブラリと見なします。サーバー側では、専用サーバーの予算がないので、PythonまたはJavaのどちらかを知っている場合は、Google App Engineが適しています。
すべては、プロトコル設計から始まります。有線で何を送信する必要がありますか?どんな種類の握手と検証メカニズムが必要ですか?ゲームが終了するたびにネットワークパケットが送信されるのと同じくらい簡単です。それは単にスコアのあるユーザー名を含んでいるでしょう、例えば{ "Joel", "33" }
問題は、スコアが正当な方法で達成されたことをどのように確認するのですか?おそらく、誰かがネットワークアナライザーでプロトコルパケットを単純に分析し、スコアのあるユーザー名のみが送信されたと結論付けたのでしょう。次に、このパケットを手動で作成して送信します。これは、「存在しないスパムを送信する」という意味でのコードランダーです。
リーダーボード自体の保存については、SQLiteなどのデータベースを使用することをお勧めします。これにより、リーダーボードへのスレッドセーフな同時保存/アクセスメカニズムが提供されます。基礎となるデータベースが同期を処理します。
ネットワークコード自体には、2つの部分が必要です。サーバーにデータを送信するものと、サーバー側でデータを消費および処理するもの。coderangeが言及したように、それはHTTP / XML / JSON HTTP GET / POSTのような単純なものである可能性があり、サーバー側で実行されているWebサーバーはWebサービスでそれを消費します。良い点は、Webサーバーによって処理されるため、サーバー側のネットワークコードを処理する必要がないことです。
私の経験から、あなたが通過しなければならない複数のステップがあります。C ++ libの選択は、それらの最も差し迫ったものではありません。あなたが考慮しなければならないより重要な事柄があります。
リーダーボードのホスティングに関しては、あなたは選択をしなければなりません。サーバーをレンタルし、必要なテクノロジーを選択して、必要なことを実行できます。または、ホスティングスペースを借りて、自由に技術者と協力する必要があります。または、クラウドソリューションの1つを使用し、それらの制約と利点を活用する必要があります。
それはすべて、コストと時間の投資と再利用性の問題です。サーバーがすでにある場合は、そこでリーダーボードをホストすることができます。ホストされているサイトをすでに使用している場合は、それを使用してプロトタイピングを開始できます。
個人的には、最初にサーバーまたは仮想サーバーを借りることをお勧めします。
この質問は独自のスレッドに値するものであり、対処するのが難しい場合は個別に回答する必要があります。
どのサーバーテクノロジを使用するかはユーザー次第であり、選択するホスティングソリューションに大きく依存します。
DB
もちろん、SQLストレージから始めることもできますが、MySQLは非常に安価で効率的で使いやすく、ほとんどのホスティングプロバイダーでサポートされています。これは私が使用しているソリューションです。ただし、スケーラビリティに関しては、後で使用することを後悔する可能性があることに注意してください。
他のより良い解決策があります。CouchDBのようなERLANGベースのDBサーバーは非常に人気があります。その1つであるRIAKは、複数のサーバーに簡単に配布でき、効率的で、JSONを使用し、MozillaやGitHubなどの有名企業で使用されています。
バックエンド
クライアントアプリから直接データストレージにアクセスすることはできません。認証、承認、いくつかのロジック、DBアクセスを管理するアプリケーションを作成する必要があります。
Java、PHP、およびPerlは、これらの機能を提供するWebサービスの作成によく使用され、ホスティングプロバイダーによって十分にサポートされ、強力な開発コミュニティを備えています。
しかし、Apacheのような本格的なHTTPサーバーのオーバーヘッドを回避したい場合は、nodeJSを使用する必要があります。これは、非常に効率的な設置面積の小さい高速なソリューションです。e-bay、Microsoft、Linked-Inで使用されます。データ交換にJSONを使用する設定に非常にうまく統合されます。
リーダーボードの設計は、データストレージから始まります。何を保存しますか。どのように保管し、どのくらいの期間保管しますか?
コースのスコア(時間、距離、ポイント...)を保存したいのですが、それで複数のレベルがありますか?次に、レベルIDを保存する必要があります。複数のプラットフォームをサポートしていますか?もしそうなら、ゲームの難易度が技術的または人口統計上の理由で異なるプラットフォームで異なる場合があります、それも保存しますか...
どのように痛めたいですか?同じプラットフォーム/レベル/コンテキストでプレーヤーが行った以前のスコアをすべて置き換えて、最高のスコアのみを保持しますか?または、すべての可能なスコアを追跡するためにすべてを保存しますか?データマイニングで破棄された以前のスコアを保持しますか?
これらの質問に答えたら、実装について考え始めることができます。
クライアントとの間でデータを転送する必要があります。このためには、適切な通信プロトコルを作成する必要があります。
基礎となるプロトコルの選択は、このステップでは二次的です(HTTP、TCP、UDP)。どちらを選択する場合でも、エラー、プロトコルの変更、アプリケーションの更新などを処理できるように、独自のプロトコルを慎重に作成する必要があります。
したがって、サーバーアプリケーションが、更新されたアプリケーションおよび古いバージョンを実行するアプリケーションへのデータの提供を処理できることを確認してください。
サーバーとの間で転送されるデータを必ず保護してください。スコアのアップロードの保護に注意してください。ハッシュキー、暗号化、その他のメカニズムを使用して、サーバーを不正行為から保護できます。
バイナリデータまたはテキスト(JSON、XML)データを送信することを選択した場所は自由です。しかし、柔軟性と互換性のために、JSONをお勧めします。XMLは避けてください。本当に必要な場合は、バイナリを使用してください。
このトピックはもっと注目に値し、さらに質問があるかもしれません...
クライアントはソリューションと統合する必要があります。クライアントの言語に基づいてサーバーの技術層とプロトコル層を選択しないでください。サーバーソリューションをゲームに統合する必要があります。
JSON over HTTPを選択した場合、そのためのライブラリがあります。
JSON用のC / C ++ライブラリがあります。それらを使用することをお勧めします。必要に応じて、独自に記述することができます。私はほんの数時間で小さなJSON libを書きました。現在、数十のプラットフォームのゲームで使用されています。
C ++のHTTPに関しては、CURLよりも新しいものを使用してください。cpp-netlibを実行する必要があります。
ただし、データを送信するときは、文字エンコーディングなどに注意してください。
ユーザーにとって最高のスコアを保存および表示できるようにするには、ユーザーを何らかの方法で識別する必要があります。複数の方法があります。
最も単純なのはなし。ここに名前を入力してくださいフィールドを使用して、リーダーボードに名前を表示します。
プレーヤーに登録を依頼することもできます...これは多くの場合、プレーヤーを落胆させるプロセスです。
私が頻繁に使用した1つの方法は、Facebook認証です。このようにして、サーバーに認証データを渡したり、サーバーを介して友達に関するデータを取得したり、パーソナライズされたリーダーボード(グローバルリーダーボード、友達リーダーボードなど)を提供したりできます。