-1

ゲーム アプリケーション用の TCP 接続が必要です。時間を有効に使うことが重要です。効率よくたくさんの物を受け取りたい。負荷がかかるため、CPU を効率的に使用することも重要です。

これまでのところ、接続がダイヤルされるたびに、go のネット ライブラリを使用して handleConnection が呼び出されることを確認できます。ただし、接続が作成されたら、ポーリングする必要があります (接続で新しいデータの準備ができているかどうかを何度も確認します)。これは非効率に思えます。不必要にCPUを消費している場合、新しいデータの準備ができているかどうかを確認するためにそのチェックを実行したくありません。

次の 2 つのオプションなどを探していましたが、探しているものが見つかりませんでした。

(1) 何らかの方法で (CPU を吸うことなく) ブロックし、接続ストリームで新しいものが準備できたときにブロックを解除する読み取り操作を実行します。私はそれを見つけることができませんでした。

(2)新しいデータが接続ストリームに到着したときに関数が呼び出される非同期アプローチを実行します(新しい接続がダイヤルされたときだけではありません)。私はそれを見つけることができませんでした。

シングル メッセージへの応答の待ち時間が長くなるため、ここにスリープ コールを入れたくありません。

メッセージごとにダイヤルアウトすることも検討しましたが、それが効率的かどうかはわかりません。

そのため、以下のコードを思いつきましたが、Decode(p) 呼び出しを使用して新しいデータを大量にチェックしているため、最適とは思えません。

どうすればこれをより効率的に行うことができますか?

func handleConnection(conn net.Conn) {
        dec := gob.NewDecoder(conn)
        p := &P{}

        for {
                result := dec.Decode(p)
                if result != nil {
                        // do nothing
                } else {
                        fmt.Printf("Received : %+v", p)
                        fmt.Println("result", result, "\n")
                }

        }

        conn.Close()
}
4

1 に答える 1