最近在网上下到 网狐6.6 内核引擎 ,这回算是有了全套了,朋友又送了套捕鱼达人的游戏,架起来总有问题。
反复调试 ,发现问题在于内核中定时器部分 。
看了下内核的代码,但从定时器上看好像没有任何问题,在6.5的内核中 ,每个定时器到时间以后都通过
PostQueuedCompletionStatus
发送了一个完成包,然后就返回了。但是 6.6 中定时器部分不是走的这个机制 (ps:也有可能我下的代码不是出自网狐),代码片段:
try
{
BYTE cbBuffer[MAX_ASYNCHRONISM_DATA] = {0}; //接收缓冲
//投递消息
NTY_TimerEvent pTimerEvent = (NTY_TimerEvent )cbBuffer;
pTimerEvent->dwTimerID = pTimerItem->wTimerID;
pTimerEvent->dwBindParameter = pTimerItem->wBindParam;
m_pIQueueServiceSink->OnQueueServiceSink(EVENT_TIMER, cbBuffer, sizeof(NTY_TimerEvent));
}
catch (…) { }
//设置次数
if (pTimerItem->dwRepeatTimes != TIMES_INFINITY)
{
ASSERT(pTimerItem->dwRepeatTimes > 0);
pTimerItem->dwRepeatTimes--;
if (pTimerItem->dwRepeatTimes == 0L)
{
bKillTimer = true;
m_TimerItemActive.RemoveAt(i);
m_TimerItemFree.Add(pTimerItem);
}
}
m_pIQueueServiceSink 是时间引擎保存的是一个接口指针。 通过这个指针转几道手,一直到调用了游戏中的定时器消息响应函数
OnTimerMessage(WORD wTimerID, WPARAM wBindParam) ? 才会返回往下执行 “设置次数”后面的代码 。 这样就出现问题了 ,如果游戏中在 OnTimerMessage 里嵌套设置同一个定时器,就会先走完 SetTimer 再走下面的“设置次数 ”,“移出定时器” ,SetTimer 里监测有没有同ID定时器的时候,自然发现已经存了该定时器,不会把该定时器放入定时器列表。等OnQueueServiceSink 返回以后 ,将该定时器删除掉,于是重新设置的定时器就有没设置成功。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
解决方法:将上面代码调整一下次序 。 先设置次数,删除定时器以后 ,再调用 OnQueueServiceSink。另外 NTY_TimerEvent 的值比较大,可以将
BYTE cbBuffer[MAX_ASYNCHRONISM_DATA] = {0}; //接收缓冲
改成
BYTE cbBuffer[sizeof(NTY_TimerEvent)] = {0}; //接收缓冲
还有一种修改方法,就是仍然采用发送完成端口包的方式 ,照着内核中其他使用队列服务的地方摘过来就可以了,这种方法更科学
上张捕鱼的图,修复了刷金问题
未经允许不得转载! 作者:棋牌源码网,转载或复制请以超链接形式并注明出处棋牌源码网。
原文地址:《网狐内核引擎 定时器 问题》发布于:2021-08-06