【码仙】许木大大jhdfrox@qq.com 11:01:23
问个问题, Entity类型存到MongoDB后, 下次从DB中拿出来后, 不用的话要不要Dispose? 取出来的时候也是用ComponentFacotry来创建的吗?
【群主】熊猫(80081771) 11:07:30
@许木 这种不需要dispose,由ComponentFactory创建的就需要,new出来的也不需要dipsose,new出来的dispose没有影响
【码仙】初见(362946) 11:14:43
@熊猫 dispose不会推到池子里吗?
【群主】熊猫(80081771) 11:15:10
@初见 不会,new出来的isFromPool是false,dipsose会判断这个值
【码仙】许木大大jhdfrox@qq.com 11:15:41
原来如此, 那一律给他dispose
【群主】熊猫(80081771) 11:16:04
ComponetFactory也可以指定不使用池子,这样dispose也不会回到池子中去
所以统一使用ComponetFactory创建就行了,最好别用new
对象池这块都是经过无数次重构了,特别跟事件系统搭配, 为什么Eventsystem中
private Queue<long> updates = new Queue<long>();
private Queue<long> updates2 = new Queue<long>();
这两个是用id呢?
因为对象池的原因,直接用对象并不能知道对象已经释放了, 用对象无法表示对象的唯一性,可能被释放又被别人重用了,用instanceId才能表示唯一性
【码神】H 2019/3/20 12:54:36
请问channel为啥不重复利用?
【群主】熊猫 2019/3/20 12:58:19
频繁构造释放的才需要用池
还有客户端gc能力差才需要用池, 服务端gc能力强,几千个连接很轻松,
还有个原因,就是tchannel里面很多很多多线程的异步操作,用池容易出问题,增加很多判断,很复杂
有很多中间状态,比如收消息过程中断开,还没收完自然不可能post过去了
socketeventargs读写回调可以带一个参数,参数是object类型,如果要判断是否还是原来的对象,那么需要参数记录channel的instanceid,这样就会装箱,也有损失,要么用一个class wrap一下防止装箱,这样又变得复杂很多,权衡各种情况,channel没有使用对象池
聊天记录
