最近在网上下到 网狐6.6 内核引擎 ,这回算是有了全套了,朋友又送了套捕鱼达人的游戏,架起来总有问题。

  反复调试 ,发现问题在于内核中定时器部分 。

  看了下内核的代码,但从定时器上看好像没有任何问题,在6.5的内核中 ,每个定时器到时间以后都通过

  PostQueuedCompletionStatus

网狐内核引擎 定时器 问题 网狐内核 网狐 游戏 棋牌技术  第1张

  发送了一个完成包 ,然后就返回了。但是 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)

  {

网狐内核引擎 定时器 问题 网狐内核 网狐 游戏 棋牌技术  第2张

  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