对Node执行scheduleUpdate方法能让节点在每帧执行一遍自己的update方法,非常方便。
但是我们在大量地使用scheduleUpdate方法时,会常常忽视使用scheduleUpdate的顺序对每个update最终被调用顺序的影响,而不同的顺序与最终游戏的逻辑息息相关,一旦顺序不对很容易出现bug。
阅读源码可知,scheduleUpdate实际上是加了一个优先级为0的定时器。
void Node::scheduleUpdate()
{
scheduleUpdateWithPriority(0);
}
再看Scheduler,优先级0的定时器在同一个队列里,在update方法执行每个定时器时,会遍历优先级0的队列。
// updates with priority == 0
DL_FOREACH_SAFE(_updates0List, entry, tmp)
{
if ((! entry->paused) && (! entry->markedForDeletion))
{
entry->callback(dt);
}
}
宏实际上是一个for循环的头。从_updates0List的头开始一个个地遍历,执行每一个update方法。
for((el)=(head);(el) && (tmp = (el)->next, 1); (el) = tmp)
回到scheduleUpdate,使用了appendIn方法插入节点的update回调。