[0]Timer Handler被覆盖
class Timer
_getHandler(caller, method) {
var cid = caller ? caller.$_GID || (caller.$_GID = ILaya.Utils.getGID()) : 0;
var mid = method.$_TID || (method.$_TID = (Timer._mid++) * 100000);
return this._map[cid + mid];
}
当游戏玩的功能多时间长了,随着caller._$GID的增加,this._map里正在使用的handler被覆盖。
我们游戏有一个战斗的主循环出现了被覆盖的情况,导致游戏战斗异常情况
没有找到相关结果
已邀请:
要回复问题请先登录
8 个回复
Laya_XS
赞同来自:
最后一个参数设置成false的意思就是用一次不回收,一直存在。感觉你Handler出问题应该是这个原因导致的。
156*****628
赞同来自:
getHandler(caller, method) {
var cid = caller ? caller.$_GID || (caller.$_GID = ILaya.Utils.getGID()) : 0;
var mid = method.$_TID || (method.$_TID = (ILaya.Timer._mid++));
return this._map[cid + '.' + mid];
}
156*****628
赞同来自:
_getHandler(caller, method) {
var cid = caller ? caller.$_GID || (caller.$_GID = ILaya.Utils.getGID()) : 0;
var mid = method.$_TID || (method.$_TID = (ILaya.Timer._mid++));
return this._map[cid + '.' + mid];
}
CallLater用cid + '.' + mid作为key,为啥Timer用cid + mid作为数组下标
Laya_XS
赞同来自:
156*****628
赞同来自:
class Timer
_indexHandler(handler) {
var caller = handler.caller;
var method = handler.method;
var cid = caller ? caller.$_GID || (caller.$_GID = ILaya.Utils.getGID()) : 0;
var mid = method.$_TID || (method.$_TID = (Timer._mid++) * 100000);
handler.key = cid + mid;
this._map[handler.key] = handler;
}
就这几行代码,试想下每次一个新的执行域caller进来那对应的$_GID是不是就自增,但是method.$_TID这个就不一定会变了,那随着caller.$_GID的不断自增,本来(注意_map这玩意是个数组)_map[cid+mid]里一个不应该被替换的handler那不就被替换掉啦!!
像class CallLater这个类里面也有一个_indexHandler一模一样的方法,那边采用的是(_map是kv)_map[cid + '.' + mid]字符串拼接当做key来存储,这种方式就不可能出现被覆盖的情况
156*****628
赞同来自:
156*****628
赞同来自:
Laya_XS
赞同来自: