2 cocos2dx 3.0 源碼分析-Director


Director 導演類, 這個類在整個引擎中擔當着最重要的角色, 先看看它是如何初始化的,它共管理了哪些內容呢? 
 
1初始化- 更新處理Scheduler
 
Scheduler 這個類負責用戶自定義的更新函數的調用, 或遊戲對象的update(float dt)的調用。 像常常調用的schedule() 或scheduleUpdate() 就是這個類來負責處理的。
 
見下面的代碼, 就是程序中如何使用schedule。 具體如何處理, 在後面的還會進行展開。 這塊能夠單拿出一章來介紹一下了。 
 
   1 this->schedule(schedule_selector(HelloWorld::update), 10);  
 
2初始化- 事件管理 EventDispatcher 
 
EventDispatcher 這個類負責整個系統的事件處理,如用戶自定義事件, 觸摸事件,等都由這個類來負責。 
 
如今咱們知道,它是在這裏申明便可, 具體在哪裏進行調用, 事件的實現原理, 也會在一章內進行展開。 
 
下面定義了幾種不一樣的事件,爲後面相應的事件觸發時做爲參數調用及觸發事件。 
 
 _eventDispatcher = new (std::nothrow) EventDispatcher();
    _eventAfterDraw = new (std::nothrow) EventCustom(EVENT_AFTER_DRAW);
    _eventAfterDraw->setUserData(this);
    _eventAfterVisit = new (std::nothrow) EventCustom(EVENT_AFTER_VISIT);
    _eventAfterVisit->setUserData(this);
    _eventAfterUpdate = new (std::nothrow) EventCustom(EVENT_AFTER_UPDATE);
    _eventAfterUpdate->setUserData(this);
    _eventProjectionChanged = new (std::nothrow) EventCustom(EVENT_PROJECTION_CHANGED);
    _eventProjectionChanged->setUserData(this);

 

3初始化紋理緩存TextureCache
 
TextureCache 紋理緩存,進行紋理處理, 重量級類, 在後面展開。 
 
initTextureCache();
 
void Director::initTextureCache()
{
#ifdef EMSCRIPTEN
    _textureCache = new (std::nothrow) TextureCacheEmscripten();
#else
    _textureCache = new (std::nothrow) TextureCache();
#endif // EMSCRIPTEN
}
 

 

4 初始化矩陣OpenGLES用到initMatrixStack();
 
矩陣,OpenGLES轉換座標時用到的,一個座標的計算方式:  投影矩陣 × 視圖矩陣 × 模型矩陣 × 3D位置
1 _modelViewMatrixStack 模型矩陣
2 _projectionMatrixStack 視圖投影矩陣
3 _textureMatrixStack 紋理矩陣, 這個作什麼用的, 我還沒深刻看, 後面再說。  
 
 _modelViewMatrixStack.push(Mat4::IDENTITY);
 _projectionMatrixStack.push(Mat4::IDENTITY);
 _textureMatrixStack.push(Mat4::IDENTITY);

 

5 初始化Render
 
渲染, 這個渲染有的說, 如今咱們知道經過它調用 咱們真正的OpenGL 渲染命令。
 
這個類設計了一個渲染隊列RenderQueue(先簡化點認爲就一個吧),用戶的渲染請求, 自定義的也好, 系統的也好, 都被封裝成爲了渲染命令加入到這個渲染隊列隊列中。 
 
 這個類設計的也頗有意思,作了不少的優化設計。 後面詳細說它。 
 
_renderer = new (std::nothrow) Renderer;
 
Renderer::Renderer()
:_lastMaterialID(0)
,_lastBatchedMeshCommand(nullptr)
,_filledVertex(0)
,_filledIndex(0)
,_numberQuads(0)
,_glViewAssigned(false)
,_isRendering(false)
#if CC_ENABLE_CACHE_TEXTURE_DATA
,_cacheTextureListener(nullptr)
#endif
{
    _groupCommandManager = new (std::nothrow) GroupCommandManager();
    _commandGroupStack.push(DEFAULT_RENDER_QUEUE);
   
    RenderQueue defaultRenderQueue;
    _renderGroups.push_back(defaultRenderQueue);
    _batchedCommands.reserve(BATCH_QUADCOMMAND_RESEVER_SIZE);
}
 
 
總結一下:
 
能夠看到,更新函數處理,事件處理,紋理緩存,渲染都已經在這個類中初始化了,也在這個類對外提供調用,Director仍是一個單例類。 而runScene() 是如何處理的呢?後面跟上。 
相關文章
相關標籤/搜索