[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被覆盖。
我们游戏有一个战斗的主循环出现了被覆盖的情况,导致游戏战斗异常情况
22B9BE31-5CF0-47C1-9998-806E6546E51A.png 48F648EC-34F8-4ACB-B789-E300251C0E92.png
已邀请:

Laya_XS

赞同来自:

你的Handler是不是使用错了,只设置的一次使用后就回收,如果你Handler一直存在的话,你可以采用new Laya.Handler的方式,也可以采用Laya.Handler.create(this,this.回调,null,false);
最后一个参数设置成false的意思就是用一次不回收,一直存在。感觉你Handler出问题应该是这个原因导致的。

156*****628

赞同来自:

像class CallLater这种拼接字符串方式就没问题啊,为啥class Timer要用数组的形式呢
 
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

赞同来自:

class CallLater
_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

赞同来自:

你要不提交个必现问题的demo吧。我们看下,只沟通没有环境,也不好说清楚你的问题。

156*****628

赞同来自:

这种情况没法给你们提供Demo啊,这要游戏玩好久才能测出来的问题哦!!!
 
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

赞同来自:

你反馈的这个问题,我们下个版本修改下,跟Callater类的处理方式同步下。

要回复问题请先

商务合作
商务合作