簡體   English   中英

iOS 14 解決方案中的 SceneKit Metal 着色器編譯性能錯誤

[英]SceneKit Metal shader compilation performance bug in iOS 14 workaround ideas

我正在尋找 SceneKit 專家來建議一些方法來解決 iOS 14.x 和 macOS Catalyst 11.x 中 SceneKit 的內置 Metal 着色器編譯中的不良性能錯誤。 由於我已經嘗試了所有我能想到的方法來讓 Apple 解決問題(TSI、反饋、Twitter、開發者論壇、Apple Evangelist),我們需要一個解決方法。

使用帶有 SceneKit 跟蹤功能的 Xcode Instruments 應用程序,在 iOS 14.0、14.1 和 14.2 Beta(包括 Beta 4)中,SceneKit 着色器編譯似乎比 iOS 13.7 慢了大約 100 倍。 例如,在 iOS 13.7 中編譯着色器通常需要 SceneKit 1-2 毫秒,而在 iOS 14 中可能需要多達 200 毫秒。

每次我們向可見場景中的父節點添加新模型節點樹時,SceneKit 似乎都會自動編譯着色器。

在我們的應用程序中加載幾十個模型節點的典型 SceneKit 場景可以從不到 2 秒到超過 30 秒。 由於 SceneKit 着色器編譯發生在似乎由 CADisplayLink 處理程序調用的渲染線程上,因此整個應用程序 UI 可能會完全凍結數秒(測試中為 30+)。 這極大地影響了我們基於 SceneKit 的應用程序的可用性。

如果您認為要獲得 60-30 fps 的場景更新,您需要每幀花費不超過 16-33 毫秒以避免丟幀,多幀每花費 200 毫秒真的很糟糕。 (如果您想在 iPad Pro 上獲得 120 fps...)

這個問題的一個問題是它非常不一致:我可以用 Instruments 運行一次應用程序,編譯時間會很好(1-2 毫秒),我會再運行幾次,每次運行都會很糟糕着色器編譯(100-200 毫秒)。 我認為有一些 Metal 着色器緩存正在進行,但我不知道它是如何工作的以及是什么導致它失效。

我已經嘗試了幾十種方法來解決這個問題:多個隊列/線程/操作、事務、延遲節點添加以一次添加多個節點、使用執行(避免:致命的崩潰錯誤)等。我嘗試添加節點在所有其他節點之前或在所有其他節點之后點亮。

我們在整個模型中使用 PBR 材料,並且在大多數場景(例如室外的太陽或月亮、室內的燈)以及環境照明中啟用了多個帶陰影的燈光。 在 SCNView 非 AR 模式下不啟用反射,但顯然 ARSceneView 確實啟用了它們。 我們通常不使用我們自己的任何着色器,但有一些場景使用自定義着色器修改器,這些修改器在移除后似乎沒有任何效果。

任何和所有建議都非常感謝。 謝謝!

以下是在裝有 iOS 14 的 iPad Pro 11 (2018) 上運行該應用程序的 Instruments 12.1 的示例場景屏幕截圖和着色器編譯時間:

在此處輸入圖片說明

00:01.347.989   667.58 µs   Compile shader  
00:01.349.275   579.62 µs   Compile shader  
00:01.350.529   779.17 µs   Compile shader  
00:01.353.772   809.92 µs   Compile shader  
00:01.358.928   909.54 µs   Compile shader  
00:01.361.232   831.96 µs   Compile shader  
00:01.363.443   779.17 µs   Compile shader  
00:01.371.931     1.09 ms   Compile shader  
00:02.336.543   786.88 µs   Compile shader  
00:02.338.079   594.67 µs   Compile shader  
00:02.344.969   805.38 µs   Compile shader  
00:02.349.393   845.71 µs   Compile shader  
00:02.351.679   775.33 µs   Compile shader  
00:02.353.969   714.75 µs   Compile shader  
00:02.355.389   578.96 µs   Compile shader  
00:02.374.813   243.54 ms   Compile shader  
00:02.619.090   204.87 ms   Compile shader  
00:02.824.654   203.34 ms   Compile shader  
00:03.033.721   203.22 ms   Compile shader  
00:03.245.523   199.92 ms   Compile shader  
00:03.446.541   641.67 µs   Compile shader  
00:03.458.231   200.25 ms   Compile shader  
00:03.670.527   202.03 ms   Compile shader  
00:03.875.402   200.12 ms   Compile shader  
00:04.089.184   725.21 µs   Compile shader  
00:04.091.070   201.98 ms   Compile shader  
00:04.297.075   212.00 ms   Compile shader  
00:04.509.799   200.11 ms   Compile shader  
00:04.710.886   203.88 ms   Compile shader  
00:04.915.507   199.86 ms   Compile shader  
00:05.116.368   199.27 ms   Compile shader  
00:05.316.424   200.51 ms   Compile shader  
00:05.517.957   203.45 ms   Compile shader  
00:05.722.065   646.38 µs   Compile shader  
00:05.723.205   582.29 µs   Compile shader  
00:05.802.072   831.96 µs   Compile shader  
00:05.808.265   203.29 ms   Compile shader  

我在 iOS 14 中看到了類似的性能回歸。在 App Clip 中運行的基於 SceneKit 的 ARKit 項目甚至發生了完全凍結。 您最近是否聽說過任何改進或解決方法?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM