[英]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.