Cocos Creator v1.6 版本發(fā)布了!感謝社區(qū)對(duì)這個(gè)版本漫長(zhǎng)測(cè)試周期的耐心等待和對(duì)測(cè)試版的積極試用和反饋。我們?cè)谶@個(gè)版本更新中繼續(xù)連結(jié)了優(yōu)化性能和提升體驗(yàn)的傳統(tǒng),而且這個(gè)版本還是后續(xù)一系列重要的引擎進(jìn)化的開(kāi)始。
我們希望改善開(kāi)發(fā)者編纂器使用體驗(yàn)的同時(shí),不停提升 JS 和 C++ 引擎的性能,解決開(kāi)發(fā)者最關(guān)心的包體、緩存、網(wǎng)絡(luò)通訊等問(wèn)題。基于這個(gè)目標(biāo),我們?cè)?v1.6 版本中加入了下列重要功能。
特色功能
- JavaScript-Binding 綁定層升級(jí),,大幅提升安卓平臺(tái)性能
- 預(yù)覽游戲時(shí)腳本免打包,改動(dòng)腳本后瞬間刷新游戲
- 批量編纂節(jié)點(diǎn)和組件屬性
- web平臺(tái)構(gòu)建時(shí)自動(dòng)將版本加入資源文件名
- 升級(jí) iOS 平臺(tái)的 WebSocket 庫(kù),解決大部分平臺(tái)專屬網(wǎng)絡(luò)通訊問(wèn)題
JavaScript-Binding 綁定層全面升級(jí)
在這個(gè)版本中,我們升級(jí)了從 JavaScript 腳本到原生平臺(tái) C++ 綁定的中間層,一方面我們將原生平臺(tái)使用的 JavaScript 引擎 SpiderM 從 v33 版本升級(jí)到了 v52 版本,大幅度提高了安卓平臺(tái)的 JavaScript 運(yùn)行性能(由于 iOS 平臺(tái)上不支持開(kāi)啟 JIT 所以效果并不明顯);另一方面我們?cè)谶@個(gè)版本開(kāi)始對(duì)綁定層接口進(jìn)行重構(gòu),目標(biāo)是:
- 提供完全抽象的 JSB 綁定層 API,獨(dú)立于 JavaScript 引擎,用戶的綁定代碼將不再受未來(lái) JS 引擎升級(jí)影響
- 支持平臺(tái)原生的 JS 引擎,包孕 Android 平臺(tái)的 v8,iOS 平臺(tái)的 JavaScriptCore。
在升級(jí)綁定層后,我們不但為后續(xù)開(kāi)發(fā)者的 C++ 層綁定開(kāi)發(fā)提供了不變的環(huán)境,并且支持原生平臺(tái)的 JS 引擎會(huì)使得構(gòu)建原生版本時(shí)的包體大幅減小,因?yàn)椴辉傩枰獙?SpiderM 引擎庫(kù)加入到發(fā)布版本中。
預(yù)覽游戲時(shí)腳本免打包
由于腳本模塊化加載的需要,我們從 Cocos Creator 第一個(gè)版本開(kāi)始就對(duì)用戶的腳本進(jìn)行編譯打包,但對(duì)于規(guī)模龐大、動(dòng)輒幾百個(gè)腳本的項(xiàng)目來(lái)說(shuō),每次修改任何腳本都會(huì)觸發(fā)整個(gè)編譯打包流程,會(huì)使得修改腳本后的等待時(shí)間非常長(zhǎng)。為了解決這個(gè)問(wèn)題,我們從 v1.6 開(kāi)始引入了編纂器環(huán)境下腳本免打包的模塊化系統(tǒng),可以在預(yù)覽環(huán)境下別離加載單個(gè)文件的腳本。對(duì)任何腳本的改動(dòng)將只觸發(fā)該腳本自己的編譯流程,使得開(kāi)發(fā)腳本后刷新預(yù)覽的周期縮短到1~2秒,大大提升開(kāi)發(fā)效率。
目前構(gòu)建后的腳本仍然需要進(jìn)行打包,因?yàn)榻K端瀏覽器里沒(méi)有相應(yīng)的加載環(huán)境。我們會(huì)在后續(xù)繼續(xù)研究構(gòu)建發(fā)布時(shí)也能連結(jié)每個(gè)腳本文件獨(dú)立存在的構(gòu)建模式,來(lái)便利需要?jiǎng)e離更新腳本的開(kāi)發(fā)者更容易安排游戲版本。
批量編纂節(jié)點(diǎn)和組件屬性
編纂 UI 場(chǎng)景時(shí),經(jīng)常會(huì)遇到需要選中一些節(jié)點(diǎn)并批量修改他們的一些屬性的需要,這個(gè)版本我們加入了屬性檢查器的批量編纂功能。
多選節(jié)點(diǎn)后這些節(jié)點(diǎn)上共享的組件和屬性就可以進(jìn)行批量編纂了,當(dāng)差別節(jié)點(diǎn)的某個(gè)屬性值差別時(shí),選中這些節(jié)點(diǎn)后,屬性檢查器上這個(gè)屬性值會(huì)顯示為 -, 修改這個(gè)屬性會(huì)讓所有選中節(jié)點(diǎn)上該屬性都釀成同樣的值。
web 平臺(tái)構(gòu)建時(shí)為資源文件名加入版本號(hào)
對(duì) H5 游戲開(kāi)發(fā)者來(lái)說(shuō),有效利用瀏覽器的緩存機(jī)制,制止用戶重復(fù)下載資源,而且在更新游戲資源時(shí)確保更新緩存的資源版本是非常重要的。我們?cè)谶@個(gè)版本的構(gòu)建發(fā)布面板里增加了 **md5 cache** 構(gòu)建選項(xiàng),勾選后會(huì)在構(gòu)建時(shí)為所有資源文件名增加該文件的 md5 碼。這樣在更新游戲版本時(shí),按照文件名的差別,用戶的瀏覽器會(huì)自動(dòng)重新下載 md5 改變了的資源,在最大限度使用緩存節(jié)省流量的情況下確保版本的一致性。
iOS 平臺(tái)上使用 SocketRocket 代替之前的 WebSocket 實(shí)現(xiàn)
我們用 facebook 開(kāi)發(fā)的 [SocketRocket 庫(kù)](https://github.com/facebook/socketrocket) 替換了之前一直在 cocos2d-x 和 Cocos Creator C++ 引擎中使用的 libWebsocket 庫(kù),這個(gè)全新的實(shí)現(xiàn)支持以下特性:
- SocketRocket 提供異步 API,更符合通訊習(xí)慣
- 封裝了跨線程通訊
- 網(wǎng)絡(luò)狀態(tài)變換時(shí)不會(huì)造成連接關(guān)閉
- 鎖定手機(jī)設(shè)備屏幕不再造成報(bào)錯(cuò)
- 不再依賴包體較大的 openssl 庫(kù)
- 使用 wss 連接時(shí)不再需要當(dāng)?shù)?CA 根證書(shū)
后續(xù)版本中我們會(huì)對(duì) socket.io 的原生實(shí)現(xiàn)也進(jìn)行進(jìn)一步的優(yōu)化,希望能為開(kāi)發(fā)者們提供一個(gè)簡(jiǎn)單、不變的網(wǎng)絡(luò)通訊編程環(huán)境。
完整改動(dòng)列表
- [Audio] [Breaking] 修復(fù) `audioEngine.stop` 會(huì)觸發(fā) finish 事件回調(diào)的問(wèn)題,現(xiàn)在 setFinishCallback 設(shè)置的 callback 只有在自然播放結(jié)束的時(shí)候
編纂器
- [Editor] 加入預(yù)覽游戲時(shí)免編譯腳本的模式,免編譯模式下 VSCode 的調(diào)試配置需要通過(guò)開(kāi)發(fā)者菜單更新
- [Editor] 移除內(nèi)置代碼編纂器,默認(rèn)雙擊文本文件時(shí)會(huì)使用系統(tǒng)默認(rèn)的應(yīng)用打開(kāi)
- [Editor] 修復(fù) Windows 上編纂器運(yùn)行路徑和項(xiàng)目路徑不在同一個(gè)驅(qū)動(dòng)器時(shí)加載腳本路徑錯(cuò)誤的問(wèn)題
- [Editor] 修復(fù)導(dǎo)出場(chǎng)景資源時(shí)引用量過(guò)大可能導(dǎo)致卡死的問(wèn)題
- [Editor] 修復(fù) require 第三方庫(kù)時(shí)的報(bào)錯(cuò) `can not find module for path : undefined`
- [Editor] editor-input 和 editor-textarea 控件添加 maxLength 支持
- [Editor] 禁止彈出和關(guān)閉部分核心面板,包孕場(chǎng)景編纂器、資源辦理器和節(jié)點(diǎn)樹(shù)。
- [Editor] 修復(fù) TS 腳本在重命名后,舊的不會(huì)刪掉導(dǎo)致腳本名稱重復(fù)的問(wèn)題。
- [Editor] 修復(fù)場(chǎng)景生存時(shí)仍有 “Cannot read property ‘_prefab’ of null” 的報(bào)錯(cuò)
- [Editor] 修復(fù) property 裝飾器在新版 VSCode 中的報(bào)錯(cuò)
- [Editor] 修復(fù)項(xiàng)目中腳本過(guò)多時(shí)會(huì)出現(xiàn) `too many open files` 的問(wèn)題
- [Editor] 修復(fù)編纂器中無(wú)法通過(guò) url 加載資源依賴的 raw asset 的問(wèn)題,修復(fù)編纂器無(wú)法正確加載 TSX 資源的問(wèn)題
- [Editor] 修復(fù)編纂器里腳本文件加載挨次不固定的問(wèn)題
- [Editor] 修復(fù)切換場(chǎng)景編纂模式時(shí)可能出現(xiàn) `Possible EventEmitter memory leak detected` 的報(bào)錯(cuò)問(wèn)題
- [Editor] 修復(fù)創(chuàng)建 ToggleGroup 時(shí)報(bào)錯(cuò)的問(wèn)題
- [Editor] 修復(fù)選中編纂 plist 中的 spriteFrame 時(shí)可能 Sprite Editor 窗口會(huì)卡死的問(wèn)題
- [Build] 構(gòu)建 Web 端時(shí)加入插入 eruda 的選項(xiàng)
- [Build] 修復(fù) windows 平臺(tái)上構(gòu)建 web 時(shí)使用 md5 cache 報(bào)錯(cuò)的問(wèn)題。
- [Build] 構(gòu)建時(shí)壓縮和合并資源 uuid,以優(yōu)化 settings.js 資源索引文件的體積。
- [Build] 修復(fù)某些項(xiàng)目會(huì)在 build-raw-assets 時(shí)卡住不動(dòng)的問(wèn)題
- [Build] 修復(fù)構(gòu)建非調(diào)試版本時(shí) settings.js 未被壓縮的問(wèn)題
- [Build] 修復(fù)構(gòu)建時(shí)添加 md5 cache 導(dǎo)致部分組件無(wú)法正確獲取資源引用的問(wèn)題
- [Build] 修復(fù)構(gòu)建 Android 時(shí)每次都會(huì)重新編譯的問(wèn)題
- [Build] 修復(fù) TTF label 在使用 md5 cache 無(wú)法正確下載資源與加載字體的 bug
- [Build] 修復(fù)較低版本 Xcode 在編譯 iOS/Mac 工程時(shí)可能遇到的 `undefined symbol: NSStreamNetworkServiceTypeCallSignaling` 編譯失敗問(wèn)題
- [Build] 在 web 構(gòu)建面板上面添加 md5Cache 選項(xiàng),為資源文件名增加 md5 編碼,用于正確更新客戶端資源緩存。