CocosCreator2.1以下版本針對IOS14黑屏的引擎升級
- 承鑫 郭
- 2020年9月23日
- 讀畢需時 2 分鐘
前言
Creator 2.2.0之前在iOS 14上出於性能,包體的考慮一直使用的是iOS系統自帶的JavaScriptCore(JSC)腳本引擎,JSC在iOS上比之前Cocos2d-JS所用的SpiderMonkey 會有一些性能優勢。但是JSC的實現不規範,為了匹配Creator的類型系統,引擎編譯時做了解決方法,例如1.10加入了instanceof shim2,還有之前的type shim。但是iOS 14修改了自帶的JSC的佈局 行為,typeof判斷跟著出錯了。(從V8支持JIT-less9開始,Creator 2.2.0中把iOS上的JSC替換為V8,因此新版本沒有這些問題。)
自定義引擎前置作業
將當前版本中的引擎Copy一份到自己的專案目錄下
(IOS CocosCreator1.8引擎路徑)
/Applications/CocosCreator1.8.app/Contents/Resources/engine)
當前專案目錄

打開CocosCreator=>偏好設置=>原生開發環境=>Javascript引擎路徑 選擇剛剛複製過來的引擎路徑並保存

保險起見重開CocosCreator,如此一來專案的自定義引擎設定就完成了
修改自定義引擎
一,打開目錄下的資源/engine/bin/jsb_polyfill.js文件,替換文件開頭的funtion,原先Code:
function t(t) {
...
}
替换为:
function t(t) {
return t && t.constructor === Function ? "function" : "object";
}

二,修改同目錄的jsb_polyfill.dev.js,原先Code:
function __realTypeOfObj(obj) {
...
}
替换为:
function __realTypeOfObj(obj) {
return obj && obj.constructor === Function ? "function" : "object";
}

三,修改/engine/gulp/util/fix-jsb-javascriptcore.js文件,原先Code:
const getRealTypeOfObj = (function __realTypeOfObj (obj) {
...
}).toString();
替换为:
const getRealTypeOfObj = (function __realTypeOfObj (obj) {
return obj && obj.constructor === Function ? "function" : "object";
}).toString();

三,進行自定義引擎編譯(如有需要)
打開終端機,先CD到專案目錄下的engine
cd /xxx/xxx/engine
安裝gulp建構工具
npm install -g gulp@3.9.1
安裝依賴module
npm install
切換Node.js版本,以防版本過新報錯(此時的Cocos環境已經是舊版)
sudo npm install -g n
sudo n 11.15.0
開始編譯
gulp build-dev

引擎編譯成功會顯示如上
建構專案,檢查引擎是否換新

將調適模式打開方便查看,構建完成後去Build->jsb-default=>src下的jsb_polyfill.js查看修改是否有包到裡面

現在就可以進行熱更檢測各版本IOS是否正常啦~
多人開發引擎建構適配
考慮到如果專案同時給多人開發的話,都要做以上步驟來引擎升級,如此一來建構後的檔案才會是適配IOS14,這樣太複雜,目前想到最簡單的解決方式為將src/jsb_polyfill.js放到build-templetes目錄下,如此一來建構完畢後build-templetes下的適配引擎jsb_polyfill.js將會覆蓋掉原本的舊版本引擎,達到統一的效果(PS.專案如果為加密腳本也一樣ok)
參考資料
https://docs.cocos.com/creator/manual/zh/advanced-topics/engine-customization.html
Comentarios