主題
js腳本中如何獲取節點的實例化對象,獲得組件通過編輯器掛載方式,還是cc.find()方式呢,那個性能好?
特別說明
CocosCreator微信小遊戲開發系列文章,是我在逐步開發過程中,基於官方文檔之上,記錄一些重點內容,以及對官方文檔中有些知識點的補充和分析。
正文
這是一段來自CocosCreator官方文檔的說明,容易被忽略,我劃個重點。
Cocos Creator 的工作流程是以組件式開發爲核心的,簡單的說,就是以組合而非繼承的方式進行實體的構建。
在 Cocos Creator 中,節點(Node) 是承載組件的實體,我們通過將具有各種功能的“組件(Component)”掛載到節點上,來讓節點具有各式各樣的表現和功能。
這段話簡單明瞭的指出了CocosCreator場景佈局的中心思想:由一個或多個具有UI組件能力、渲染能力、腳本等組建特性的Node節點堆疊組成的界面。
腳本組件,是負責場景中根據業務需要來處理節點組件的動態加載、刷新和後臺網絡請求等事務的組件,要在腳本中更新和動態加載組件,就得先獲得節點和組件的實例化對象,那如何高性能的獲得節點和組件呢?
在Cocos社區有一篇大神性能分析的文章:解讀 Cocos Creator 引擎:讓實例化快 50% 的原理,“拖節點”性能會更好嗎?
這篇文章分析了“實例化”原理,給出了一些性能優化的建議。下面是結合這篇文章和其他資料,個人對獲得組件的方式的一點看法。
獲得節點或組件的兩種方式:
- 在“屬性檢查器”設置節點或組件,拖動層級管理器上的節點,到腳本組件上對應的屬性即可
cc.Class({
extends: cc.Component,
properties: {
// 聲明 player 屬性
player: {
default: null,
type: cc.Node
}
},
});
- 在腳本中通過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,以類的概念來理解,作爲模塊化的基礎