棋牌源码网

最近在网上下到 网狐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}; //接收缓冲

  还有一种修改方法 ,就是仍然采用发送完成端口包的方式,照着内核中其他使用队列服务的地方摘过来就可以了,这种方法更科学

  上张捕鱼的图 ,修复了刷金问题

本文链接:https://www.jr160.com/game/1589.html

版权声明:

本站发布的内容若侵犯到您的权益,请邮件联系 web58678@gmail.com 删除,我们将及时处理!

从您进入本站开始,已表示您已同意接受本站【免责声明】中的一切条款!

本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行研究。

本站资源仅供学习和交流使用,版权归原作者所有,请勿商业运营、违法使用和传播!请在下载后24小时之内自觉删除。

若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,使用者自行承担,概与本站无关。