您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx入门二之游戏循环

2012-12-22 19:22 218 查看
代码执行流程:
Cocos2dxRenderer.onDrawFrame()->Cocos2dxRenderer.nativeRender()->Java_org_cocos2dx_lib_Cocos2dxRenderer.cpp.Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeRender()->
CCDisplayLinkDirector.mainLoop()-> CCDisplayLinkDirector.drawScene()->m_pScheduler.update(m_fDeltaTime);m_pRunningScene.visit()

说明:
虽然每个CCObject对象都有个update方法,但是看源码,主循环中并没有直接调用这个update方法来进行逻辑循环,而只是调用schdule的update方法进行,同时不停的调用visit方法对ui树进行重绘。
每一个 CCNode对象都持有同一个m_pScheduler对象实例在构造函数中从CCDirector获取,该对象实例由CCDirector初始化的时候初始化,并持有。因此,可以通过CCNode的schedule方法来设置ticker进行场景内的游戏循环,例子中的HelloWorld就是这样做的。也就是说,如果想要在主循环中进行逻辑处理,则必须向scheduler注册,可以用CCNode的schedule或者scheduleUpdate(),scheduleUpdate需要覆盖该node的update方法,并在里面做逻辑处理。当然,这是正确方法,还有错误方法同样可以实现目的,但是不建议这么做,即重写visit方法,在里面做逻辑处理。
由于整个循环是在Cocos2dxRenderer.onDrawFrame()中进行,而Cocos2dxRenderer.onDrawFrame()这个方法又是由android系统在一个ui线程之外的线程来中循环调用的,因此,可以理解为,coco2dx的游戏循环是在异步线程中进行游戏逻辑执行和绘制的。

ps:在Windows平台,主循环是在main.cpp的一个while循环中发起的,最后还是走到CCDisplayLinkDirector.mainLoop()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: