2012-03-15 12 views
3

私はゲームサーバーを作成しようとしています、そして現在、私はスレッドでそれを作っています。すべてのオブジェクト(プレイヤー、モンスター)は、(1)サイクルで独自のスレッドを持ち、特定の機能が実行されます。どのようにゲームサーバー:ASIO仕事非同期?

とサーバは、基本的には、次のように動作します。私は、そのようにスレッドを使用して をサーバーを作ることは効率的ではない聞いたことがあると私はブースト:: ASIOを使用することを考慮し、確認する必要があり

main(){ 

//some initialization 

while(1) 
{ 
//reads clients packet 
//directs packet info to a particular object 
//object performs some functions 
//then server returns result packet back to client 
Sleep(1); 
} 

関数は非同期で動作します。 しかし、私はどのようにサーバーが動作するのかわかりません。誰かが基本的にそのようなサーバーがどのように機能するのかを説明すると感謝しています。

答えて

5

すべてのオブジェクト(プレイヤー、モンスター)は、独自のスレッドを持っています。 私はそれはあなたが正しいことを

のようなスレッド を使用してサーバを作るためには効率的ではない聞いたことがある、これはスケーラブルな設計ではありません。 10,000個のオブジェクト、あるいは100万個もの大規模なゲームを考えてみましょう。このような設計は、オブジェクトごとにスレッドを必要とすると、すぐに分断されます。これはC10K problemとして知られています。

私は、Boost :: Asioを使用して、機能を非同期で で動作させることを検討してください。しかし、私はどのようにサーバーが動作するのかわかりません。 誰かがそのような サーバがどのように機能するかを基本的に説明するだろう場合、私は感謝されます。

Boost :: Asio tutorialsに従ってください。まず、Asynchronous TCP daytime serverに注意してください。あなたは、プログラムの流れが反転していることを理解した後、同期のプログラミングに比べconcept of asynchronousプログラミングは難しいことではありません。ハイレベルから、あなたのゲームサーバーがboost::asio::io_serviceによって駆動され、イベントループを持つことになります。過度に単純化され、それが一緒にイベントループ意志チェーン業務から呼び出されるコールバックハンドラ

int 
main() 
{ 
    boost::asio::io_service io_service; 
    // add some work to the io_service 

    io_service.run(); // start event loop 

    // should never get here 
} 

次のようになります。つまり、クライアントからデータを読み込むためのコールバックが呼び出されると、ハンドラは別の非同期操作を開始します。

この設計の美しさは、スレッドと同時実行を切り離すことです。ゲームサーバーで長時間実行される操作(クライアントからのデータの読み取りなど)を考えてみましょう。非同期メソッドを使用すると、ゲームサーバーは操作が完了するまで待つ必要はありません。カーネルに代わって操作が完了したときに通知されます。

関連する問題