2016-12-27 17 views
3

jsマルチプレイヤーゲームでメモリリークがあります。私はクライアントがサーバーに接続されているときに多くのコールバックをバインドします。私の質問は、プレイヤーのテーブルからソケットを削除する前にコールバックのバインドを解除する必要がありますか?ここでソケットを削除する前にバインド解除コールバックが必要ですか?

は私のサンプルのコールバックです:ここで

Player.prototype.viewPortListenerInit = function(){ 
    var self = this; 

    this.socket.on('clientViewPortResize', function(data){ 
    self.clientViewPort = data; 
    }); 

    }; 

は選手のリスト/ HashSetのにプレーヤーを追加します

this.list[socket.id] = new Player(socket); 

そして、ここでは削除されます。

socket.on('disconnect', function(){ 
     delete this.list[socket.id] 
}); 
+0

https://www.alexkras.com/simple-guide-to-finding-a-javascript-memory-leak-in-node-js/ 私はこれをスキミングしましたが、おそらくすべてを削除するのを忘れたようですものへの参照。 –

+0

「削除」とはどういう意味ですか?そして、どこからそれをアンバインドしますか?本当に必要なのは、イベントをトリガする場所からソケットへの参照を削除することです。 – Bergi

+0

私はプレイヤーのリストを持っており、このように削除を実行します:delete this.list [socket.id]; – peterSweter

答えて

2

ときがインスタンスEventEmitter(ソケットのような)への参照はなく、コールバックでガベージコレクションされます。

+0

しかし、このコールバック内のPlayerオブジェクトへの参照があり、playerオブジェクトはsocketへの参照を保持します。それはまだ収集されていますか? – peterSweter

+1

オブジェクトへの参照がガベージコレクションされていない場合 –

+0

プレイヤーのリストからPlayerオブジェクトを削除した後、ソケットコールバックを除き、プログラムからソケットに到達する方法はありません。このソケットのバインドを解除するか、何らかのsocket.disconect()を行う必要がありますか? – peterSweter

関連する問題