微信小遊戲開發之js腳本訪問節點和組件方式選擇

主題

js腳本中如何獲取節點的實例化對象,獲得組件通過編輯器掛載方式,還是cc.find()方式呢,那個性能好?

特別說明

CocosCreator微信小遊戲開發系列文章,是我在逐步開發過程中,基於官方文檔之上,記錄一些重點內容,以及對官方文檔中有些知識點的補充和分析。

正文

這是一段來自CocosCreator官方文檔的說明,容易被忽略,我劃個重點。

Cocos Creator 的工作流程是以組件式開發爲核心的,簡單的說,就是以組合而非繼承的方式進行實體的構建。
在 Cocos Creator 中,節點(Node) 是承載組件的實體,我們通過將具有各種功能的“組件(Component)”掛載到節點上,來讓節點具有各式各樣的表現和功能。

這段話簡單明瞭的指出了CocosCreator場景佈局的中心思想:由一個或多個具有UI組件能力、渲染能力、腳本等組建特性的Node節點堆疊組成的界面。

腳本組件,是負責場景中根據業務需要來處理節點組件的動態加載、刷新和後臺網絡請求等事務的組件,要在腳本中更新和動態加載組件,就得先獲得節點和組件的實例化對象,那如何高性能的獲得節點和組件呢?

在Cocos社區有一篇大神性能分析的文章:解讀 Cocos Creator 引擎:讓實例化快 50% 的原理,“拖節點”性能會更好嗎?

這篇文章分析了“實例化”原理,給出了一些性能優化的建議。下面是結合這篇文章和其他資料,個人對獲得組件的方式的一點看法。

獲得節點或組件的兩種方式:
  1. 在“屬性檢查器”設置節點或組件,拖動層級管理器上的節點,到腳本組件上對應的屬性即可
cc.Class({
    extends: cc.Component,
    properties: {
        // 聲明 player 屬性
        player: {
            default: null,
            type: cc.Node
        }
    },
});
  1. 在腳本中通過api(this.node.getChildByName()/cc.find())查找
cc.Class({
    extends: cc.Component,

    start: function () {
        //查找當前節點的子節點
        //var nodeList = this.node.children;
        var bgNode  = this.node.getChildByName("Bg");
        //根據傳入的路徑進行逐級查找
        //cc.find("Bg/StartBtn/Text", this.node);
        //只傳入第一個參數時,將從場景根節點開始逐級查找
        //this.backNode = cc.find("Canvas/Bg/Back");
    }
});

注意: getComponent()方法是獲取組件實例的方法,在this.node.getComponent是獲取節點的組件,和this.getComponent是等效的。

結論

場景中靜態的節點,儘量都使用在“屬性檢查器”中設置節點或組件的方式,動態加載的節點纔去採用getChildByName/cc.find。

簡單說下我get到的幾個點:

  • 剛開始我挺糾結用那種方式獲得引用實例的,當我對開發完成的場景中節點重命名後,我發現拖到屬性檢查器上的節點名也自動更新,而getChildByName/find的路徑需要手動去改;
  • getChildByName是需要遍歷去查找的,cc.find同樣逐級去查找,簡單的看它們的性能消耗肯定更大

有哪裏理解錯誤的,請大家即時點醒,謝謝!

結尾

自己動手寫,分解項目中的各個模塊需求,通過查文檔和搜索Cocos社區,解決碰到的問題,最終在微信上線了下面這款微信小遊戲《成語錦衣衛》,歡迎大家掃碼體驗,並作爲參考項目模版,開發出屬於自己的小遊戲


預告

下一節和朋友們說一說:不繼承cc.Component的cc.Class,以類的概念來理解,作爲模塊化的基礎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章