版本介紹
v3.4 是自 2021 年初 3.0 發布以來快速迭代后的一個年度收官版本,要的就是一個字:穩!這個版本研發和測試周期都比之前版本更長,也在社區進行了長達一個月的公開測試,在此也要感謝所有參與測試的開發者們!
在 v3.4 中不僅增加了像 Marionette 動畫系統這樣的重要功能,而且在產品體驗、穩定性、性能優化、基礎架構層面都做了大量的工作。除此之外,我們還集中修復了一批社區反饋比較多的問題,解決了一些以前遺留的疑難雜癥。相信引擎團隊傾注心血奉獻給大家的 v3.4 版本會成為一個里程碑版本,更好得幫助開發者開發出優秀的游戲作品!
重點介紹
動畫系統 Marionette
動畫系統是 3.4 中最重要的新功能,我們取名為 Marionette,意思是提線木偶,不僅形象得描述了它的作用,而且使用提線木偶的木偶劇還是源自于中國的傳統藝術形式,從唐代就出現,千年來流傳至今仍然是閩南地區重要的戲曲形式。借助 Marionette,我們也希望開發者能夠完美控制游戲角色,增強游戲通過角色敘事的能力。
在 3.4 版本中,Marionette 已經支持動畫系統的基礎功能,包含狀態機、子狀態機、狀態機組件、觸發器變量、Blend Tree 等。當然,更完善的動畫系統能力還在迭代中,比如動畫層級和遮罩、人形骨骼和 IK 等能力已經在繼續開發之中。為了幫助大家學習 Marionette 動畫系統,我們也準備了詳細的文檔、[Demo]和視頻教程。

編輯器體驗優化
在編輯器體驗方面,我們做了大量的體驗細節優化和疑難雜癥的處理。功能和體驗優化包括:
- 動畫編輯器支持標準貝塞爾曲線緩動預設,點擊選中曲線片段后點擊曲線預設即可應用

- 新增矩形工具(Rect Gizmo)的智能對齊功能

- 支持開發者自定義宏配置

- 支持 RenderTexture 的 wrap mode,filter 等參數

- 新增 Octree 空間管理加速結構,優化了視錐剔除性能,可在場景 inspector 中開啟

光照模型和渲染優化
v3.0 以來,Creator 一直在不斷積累和打磨渲染能力,v3.4 中為了增強引擎的氛圍感和畫面效果,也帶來了一系列重要的升級。尤其是光照模型的改進將使得引擎在光照表現層面更加精細。
- 支持自動生成環境貼圖卷積圖用于漫反射計算
手動設置環境光 vs 自動生成漫反射卷積圖

- 支持 HDR 和 LDR 渲染切換(在場景節點 Skybox 配置中)
關閉 HDR vs 開啟 HDR

- 支持 IBL 采樣降噪(standard 材質中勾選 USE REFLECTION DENOISE)
開啟 Denoise vs 關閉 Denoise

渲染管線強化
在渲染管線方面,FrameGraph 是從 v3.1 開始引入的基礎設施,經過幾個版本的迭代,在 v3.4 我們正式將 Forward 和 Deferred 管線都對接了 FrameGraph,下面是一個簡化的延遲管線 FrameGraph。

目前引擎的延遲管線總共包含 2 個計算 pass,7 個渲染 pass,雖然不算復雜,但已經能凸顯 FrameGraph 的作用了。一方面簡化了管線層的代碼組織,降低了維護成本;另一方面也降低了開發者定制管線時的心智成本?;?FrameGraph,華為 HMS CG Kit 團隊在 v3.4 中繼續在延遲管線中貢獻了 Clustered Light Culling 用于優化動態光源計算性能,可在移動端支持同屏數百個動態光源(麒麟 990 芯片在 Sponza 場景運行 1000 盞動態光源可達到 40 fps)

另外,渲染管線中的 Subpass 也是基于 FrameGraph 來實現的,FrameGraph 的第二大優勢就是延遲模式渲染(不同于延遲渲染管線),引擎可以先分析渲染流程,進行優化之后再執行完整渲染流程。目前移動端的 GPU 都是和 CPU 共享系統內存的,功耗的一大熱點就是對于顯存的讀寫。而 Subpass 優化就是充分利用 GPU 的 Tiled 緩存來降低顯存讀寫功耗,當兩個相鄰渲染 Subpass 的寫入資源和讀取資源是同一份幀內資源,且不會被其他 pass 引用時,這個資源就只會通過 Tiled 緩存來讀寫,不會讀寫內存,可以明顯降低功耗。這種對資源和渲染流程的自動推導正是 FrameGraph 帶來的優勢。

重要 Fix 和性能優化
正如前文介紹,穩定性是 v3.4 版本的首要目標,所以我們也修復了一些困擾多時疑難雜癥,將引擎的穩定性推上了一個新的高度。下面列舉一些比較重要的修復
- 修復了動畫編輯過程中使用 Active 可能會導致數據丟失的嚴重問題
- 修復場景在部分異常報錯的情況下,會出現 MissingScript 組件,導致場景啟動失敗的問題
- 修復 iOS 重復退出進入造成的崩潰
- 修復 GLES3 后端在部分芯片上材質編譯導致的崩潰問題
- 修復 Vulkan 后端在一些低端機上的黑屏問題(通過更準確地下發 barrier 和 image layout 轉換)
- 修復 Vulkan 后端在一些低端機上的崩潰問題(通過修改 shader 繞開一些驅動支持不完善的語法)
- 修復 Vulkan 后端在轉屏或分屏時崩潰或分辨率不對問題
- 修復 Vulkan 后端在使用大量高分辨率貼圖時的崩潰問題
- 修復少數設備 Chrome 上的黑屏問題
- 修復 mountedChlidren 里有 PrefabInstance 可能會導致數據錯誤的問題
- 修復復制 Prefab 時可能出現的 fileId 沖突,會進而導致數據丟失和報錯
- 修復 Prefab 中引用了被刪除的元素數據,導致序列化了很多冗余數據的問題
- 修復 Undo 可能導致 prefab 內的部分 override 數據丟失的問題
- 修復地形還原的時候,可能出現數據錯誤的問題
- 修復運行時切換場景后 Label 引用的 GPU 內存沒有釋放的問題
- 修復 InstanceBuffer 和 BatchedBuffer 由于持有全局 Map 導致的內存泄露問題
- 修復部分小游戲平臺全局 precision 指定失敗導致的大量問題,比如陰影采樣問題
- 修復場景烘焙的情況下原生平臺沒有傳遞正確的 baked 參數
- 修復 GLES 下有概率會出現的模型閃爍問題(通過優先使用 glMapBufferRange 而非 glBufferSubData)
- 修復當模型骨骼權重中有 NaN 時在不支持浮點貼圖的設備上花屏的問題(通過在導入期均分所有 NaN 權重)
- 修復原生端預烘焙動畫 Instancing 處理后大批量數據同步崩潰
- 修復多個同名插件且注冊了資源,會導致腳本編譯失敗的問題
- 修復原生平臺重新構建后無法更新遠程資源包內容的問題(來自論壇反饋)
- 修復原生選擇加密構建后,原始代碼仍然被打進 apk 的問題 (來自論壇反饋)
- 修復自動圖集使用壓縮紋理后,修改圖集配置重新構建仍使用緩存;
除了重要問題的修復以外,引擎的整體性能也得到了一定的提升,比如 2D 渲染和合批效率、物理性能、iOS Web 的 3D 場景性能、Android 部分場景。下面是 2D 渲染的部分測試結果:

已知缺陷和潛在兼容問題
構建模板升級
由于調整了 web 平臺屏幕適配的相關邏輯,我們改動了 Web 相關的 index.html 模板,這里包括預覽模板、構建 web 平臺模板。
我們已經在引擎內部做了相關的兼容處理 。
這個處理會確保 index.html 內部有一個固定的 div 結構
<div id="GameDiv">
<div id="Cocos3dGameContainer">
<canvas id="GameCanvas"></canvas>
</div>
</div>
如果缺失了 GameDiv / Cocos3dGameContainer,運行時會自動補齊
注意:這個 div 結構是引擎內部管理的私有結構,我們希望保持這個結構完整且不被定制。如果在這個結構內加入了其他 web 標簽,可能會導致一些不確定的兼容問題。
IBL 采樣降噪
新增的 IBL 采樣降噪算法目前對 iOS Web 環境兼容有一些問題,由于發現較晚就沒有在版本中合并了,會在后續的 3.4.1 中完成對 iOS Web 的支持
延遲管線缺陷
目前延遲管線仍然在高速迭代過程中,功能和平臺兼容性還存在一些問題,暫不建議在項目中實戰使用。目前已知的一些問題包括部分粒子混合模式無法渲染,暫不支持 builtin-toon 材質,部分低端平臺和設備有兼容性問題,不支持聚光燈陰影,2D & 3D 相機混排問題等。
更新列表
Feature
- 【Animation】新增 Marionette 動畫系統,支持狀態切換、子狀態機、Blend Tree 等角色動畫必要功能
- 【Animation】動畫編輯器支持標準貝塞爾曲線緩動預設
- 【Animation】曲線關鍵幀支持 Broken 斷開關聯分開控制左右控制桿
- 【Scene】支持自動生成環境貼圖卷積圖用于漫反射計算
- 【Scene】新增矩形工具(Rect Gizmo)的智能對齊功能
- 【Scene】新增 Octree 空間管理加速結構,優化了視錐剔除性能[文檔]
- 【Scene】新增 GPU Occlusion Query 剔除(默認關閉),可以通過`root.pipeline.setOcclusionQueryEnabled(true);` 開啟【Project】支持開發者自定義宏配置[文檔]
- 【Scene】新增原生平臺內存泄漏檢測系統(默認關閉),可以通過` #define USE_MEMORY_LEAK_DETECTOR 1`開啟[文檔]
- 【Builder】構建支持外部開發者注冊自定義紋理壓縮處理工具
- 【Builder】Mac / iOS 平臺構建添加 "跳過 Xcode 工程更新" 選項, 避免覆蓋對工程文件的修改
- 【Builder】合并安卓、Windows 的 GLES 選項,不允許單獨選擇 GLES2
- 【Particle】支持粒子發射器剔除,支持離線自動計算,也支持手動調整(RenderCulling 模塊)
- 【Particle】支持粒子朝向和節點朝向統一
- 【Asset】支持 RenderTexture 的 wrap mode,filter 等參數
- 【Asset】RenderTexture 添加 readPixels 接口
- prefab 支持批量取消關聯
- 【Asset】FBX 導入器的動畫烘焙速率新增“自動”選項
- 【Asset】FBX 導入器新增選項:優先使用文件時間范圍
- 【Asset】SpriteFrame 資源面板上的 packable 屬性除了影響自動合圖以外將會影響自動圖集的構建處理,關閉后不參與構建合圖
- 【Asset】地形模塊支持自動 LOD
- 【Graphics】支持 IBL 采樣降噪(standard 材質中勾選 USE REFLECTION DENOISE)
- 【Graphics】更準確的 Gamma Correction
- 【Renderer】支持 HDR 和 LDR 渲染切換(在場景節點 Skybox 配置中)
- 【Renderer】前向和延遲渲染管線均基于 FrameGraph 和 subpass 重構
- 【Renderer】gfx 封裝 swapchain 公開接口,支持多窗口應用
- 【Renderer】延遲管線使用 Clustered Light Culling 優化動態光源計算性能,[參考 Demo]
- 【Renderer】延遲管線支持設置離屏 FBO 分辨率縮放
- 【Renderer】延遲管線支持 FXAA 抗鋸齒
- 【Renderer】延遲管線支持簡易 Bloom 后處理特效
- 【Scripting】支持 @requireComponent 傳入數組
- 【Scripting】新增接口 JsbBridge 簡化調用 Java 代碼和 ObjC 代碼的使用,參考[展示用例](https://github.com/cocos-creator/example-3d/blob/v3.4/native-script-bridge/README.md)
- 【PAL】新增 input 模塊,未來將替代 `systemEvent`,具體參考 [Event Input 文檔]和 [Event Node 文檔]
- 【PAL】在 `EventMouse` 和 `EventTouch` 上支持 `preventSwallow` 屬性,支持事件穿透派發:`event.preventSwallow = true`
- 【PAL】支持 sys.hasFeature() 接口查詢平臺特性是否支持
Improvement
- 【Scripting】升級原生所依賴的 v8 引擎到 v9.1.269
- 【Renderer】多光源收集的性能優化
- 【Renderer】優化 GLES/WebGL 的 RT 性能
- 【Renderer】優化原生內存/顯存使用(通過周期性調用 framegraph gc)
- 【Graphics】修復半透明物體的光照和陰影計算
- 【Graphics】優化霧效,將計算遷移到 Fragment Shader 中,保障正確的霧效過渡
- 【Graphics】禁用半透明物體的多光源照明
- 【Scene】為世界坐標軸加上坐標軸文字
- 【Scene】地形編輯器增加選擇模式
- 【Physics】優化了 PhysX 在原生平臺的包體
- 【Physics】PhysX 現已支持 M1 設備
- 【PAL】優化 Web 端方向適配,以構建面板選擇的方向為主,無視瀏覽器方向
- 【PAL】在 Web 和 小游戲端,立即派發輸入事件,解決一些用戶交互權限的問題
- 【PAL】為所有平臺和模擬器更換了全新的 App 默認圖標
- 【PAL】現在 iOS 平臺構建會根據橫屏或豎屏選項引入相應的默認Launchscreen 圖片(若更改后未及時生效需要重啟設備清理緩存)
- 【Asset】修復 FBX 動畫導入尾幀丟失的問題
- 【Asset】修復擴展名為大寫的時候,資源 change 通知可能丟失的問題
- 【Asset】解決新增資源可能沒有發送 add 事件,導致 assets 面板可能一直等待的問題
- 【Builder】構建配置服務器地址改為記錄在 settings.json 內,方便動態更新
- 【Builder】新建自動圖集,將會默認開啟在 Bundle 內的剔除選項(優化需求)
- 【Extension】插件管理器的開發者面板允許導入除了當前項目或者全局目錄以外的插件