在阅读CCSeheduler.cpp代码时,遇到了一些疑问
基于cocos2dx_3.14.1版本
void Scheduler::schedulePerFrame(const ccSchedulerFunc& callback, void *target, int priority, bool paused)
{
tHashUpdateEntry *hashElement = nullptr;
HASH_FIND_PTR(_hashForUpdates, &target, hashElement);
//这里如果找到了元素,怎么判断是否为 callback 呢
if (hashElement)
{
// 改变优先级: 首先需要 unschedule 它
if (hashElement->entry->priority != priority)
{
unscheduleUpdate(target);
}
else
{
// 不要再次添加它
CCLOG("warning: don't update it again");
return;
}
}
...
}
这里 HASH_FIND_PTR(_hashForUpdates, &target, hashElement);在快速访问入口表中寻找是否存在对应的target,如果存在,那么将元素放入 hashElement中。
再然后就判断hashElement是否为nullptr了。不是,表明该target对应的元素存在,从而判断出该callback已经添加到表中。
感觉这里有些问题啊,如果在列表中添加多个callback到该target上,那么在_hashForUpdates中体现不出来啊,因为此时target相同,在添加的时候报错的。不知我的理解对不对啊,请大大指点。