スクリプト機能を備えたゲームサーバーを設計しています。一般的な設計は次のようになります。
Client connects to Server,
Server initializes Client,
Server sends Client to EventManager (separate thread, uses libevent),
EventManager receives receive Event from Client socket,
Client manages what it received via callbacks.
さて、最後の部分は私にとって今最もトリッキーなことです。
現在、私の設計では、Client
特定の受信イベントへのコールバックを作成するために継承するクラスを使用できます。これらのコールバックはリストで管理され、受信したバッファーは、何かを受信するたびに解析プロセスを実行します。バッファが有効な場合、コールバックが呼び出され、バッファ内の内容に基づいて動作します。注意すべき点の1つは、コールバックがスクリプトエンジンに到達する可能性があることです。この時点では、何が発生するかはわかりません。
コールバックが終了するたびに、現在の受信バッファをリセットする必要があります。前述のように、何かが発生する可能性があるため、コールバックには現在、値を返す機能がありません。
何が起こるかというと、コールバックのどこかでthis-> disconnect()と表示されたら、すぐに切断してClient
、から削除しEventManager
、最後に、から削除しServer
ます。ここで、最終的に破棄され、メモリが解放されます。ただし、クライアントでコールバックが終了した後もコードが実行されているため、メモリを解放できません。
デザインで何を変更すればよいですか?どのが自由に破壊できるかServer
をチェックする時限イベントが必要ですか?Client
それは私が必要としない追加のオーバーヘッドを作成しますか?コールバックが終了した後でも、スタック(return -1;
)で最小限のコードを実行しても問題ありませんか?
どうすればいいのかわかりませんが、デザインを完全に刷新する準備ができています。
前もって感謝します。