Post

Replies

Boosts

Views

Activity

Reply to How to disable Metal compiler warnings for SceneKit / ARKit?
Using Instruments and SceneKit profiling I've found shader compilation in our app is about 100x slower in iOS 14.0 & 14.2 vs. 13.7. For example, 200ms vs. 2ms. This is probably due to the excessive logging, but there could also be other issues. The same problem occurs in macOS Big Sur Beta for the Catalyst version of our app. Here's a sample profile loading a scene in our app: iOS 13.7 Start Duration Stage 00:01.991.065 743.46 µs Compile shader 00:01.992.512 738.50 µs Compile shader 00:01.994.517 1.83 ms Compile shader 00:02.004.412 7.75 ms Compile shader 00:02.014.193 1.59 ms Compile shader 00:02.017.340 1.59 ms Compile shader 00:02.231.516 1.78 ms Compile shader 00:02.235.465 2.22 ms Compile shader 00:02.238.922 1.27 ms Compile shader 00:02.240.839 612.17 µs Compile shader 00:02.241.988 1.71 ms Compile shader 00:02.245.526 1.13 ms Compile shader 00:02.248.269 2.40 ms Compile shader 00:02.251.258 3.53 ms Compile shader 00:02.255.415 1.76 ms Compile shader 00:02.257.790 1.24 ms Compile shader 00:02.261.007 1.39 ms Compile shader 00:02.263.038 662.88 µs Compile shader 00:02.264.685 633.46 µs Compile shader 00:02.268.135 1.29 ms Compile shader 00:02.270.013 625.88 µs Compile shader 00:02.271.579 1.57 ms Compile shader 00:02.275.123 1.42 ms Compile shader 00:02.277.399 664.29 µs Compile shader 00:02.279.553 858.88 µs Compile shader 00:02.323.472 1.96 ms Compile shader 00:02.709.819 2.77 ms Compile shader 00:02.713.130 1.89 ms Compile shader 00:02.742.231 1.28 ms Compile shader 00:02.755.714 750.38 µs Compile shader iOS 14.2 Start Duration Stage 00:03.268.055 1.04 ms Compile shader 00:03.272.247 939.42 µs Compile shader 00:03.275.733 1.09 ms Compile shader 00:03.278.655 823.42 µs Compile shader 00:03.297.285 247.30 ms Compile shader 00:03.545.357 211.33 ms Compile shader 00:03.757.419 206.94 ms Compile shader 00:03.965.727 205.61 ms Compile shader 00:04.172.686 206.78 ms Compile shader 00:04.390.671 208.49 ms Compile shader 00:04.603.269 206.41 ms Compile shader 00:04.810.495 208.02 ms Compile shader 00:05.027.189 118.36 ms Compile shader 00:05.157.610 842.29 µs Compile shader 00:05.159.270 227.94 ms Compile shader 00:05.395.161 228.50 ms Compile shader 00:05.624.389 207.48 ms Compile shader 00:05.832.939 207.77 ms Compile shader 00:06.041.442 204.93 ms Compile shader 00:06.247.441 207.00 ms Compile shader 00:06.455.536 206.45 ms Compile shader 00:06.662.692 116.07 ms Compile shader 00:06.779.364 116.29 ms Compile shader
Topic: Graphics & Games SubTopic: Metal Tags:
Sep ’20
Reply to How to disable Metal compiler warnings for SceneKit / ARKit?
Courance, that's an interesting idea. But I tried it with all my loaded .scn and .usdz models and while it seems to reduce the logging, it doesn't improve the performance. Shader compile times are still around 200ms instead of 2ms. Do you think I might be doing it wrong? if let node = SCNReferenceNode(url: url) { 		node.load() 		node.enumerateChildNodes { (node, stop) in 				if let geometry = node.geometry { 						let shader = """ 								scn::reduce_op(vec4(0, 0, 0, 0), vec4(0, 0, 0, 0)); 								const metal::sampler s = scn_shadow_sampler_ord_z; 								while (&s > &s) { 										break; 								} 						""" 						geometry.shaderModifiers = [.surface : shader] 				} 		} }
Topic: Graphics & Games SubTopic: Metal Tags:
Sep ’20
Reply to How to disable Metal compiler warnings for SceneKit / ARKit?
The excessive logging is now gone in iOS 14.2 Beta 2, but the compile time is still very bad. SceneKit shader compilation is still about 100x slower in iOS 14.2 Beta 2 than in iOS 13.7. I re-ran my tests with Instruments and unfortunately the results are very similar to 14.0 and 14.2 Beta 1. The warning logging may have just been an indication of a deeper problem rather than the cause of the bad performance.
Topic: Graphics & Games SubTopic: Metal Tags:
Sep ’20
Reply to iOS 14 change in performance cost of SCNNode creation
This might be caused by the shader compiler performance bug in SceneKit in iOS 14. Shader compilation when adding nodes to a scene can be 100x slower in iOS 14 than in iOS 13. See https://developer.apple.com/forums/thread/659856 for more about this. You can use the Xcode Instruments tool with the SceneKit profiling template to profile your app to take a look at the shader compile times. After you start then stop an Instruments SceneKit recording session, tap SceneKit Application > Frames above the lower window pane and change it to Events. Then type "compile" in the Input Filter control to limit the list to shader compile events. Normal (i.e., iOS 13) compile times for our app are around 1-2 ms but in iOS 14, compile times may be more like 100-200 ms. Even if shader compiling is not your problem, Instruments may give you some insight into what else may be going on.
Sep ’20
Reply to Convert .scn to USDZ from within an app
I've tried this for quite a while also and it has never worked well. A USDZ file is exported, but it's usually useless because there are so many bugs (which I've reported). It would be great if someone at Apple actually worked on this, but so far it doesn't seem to get much love. Here's a quick example of how to at least try it:     func make3DModel(fileName: String) -> URL? {         let sceneURL = URL(fileURLWithPath: NSTemporaryDirectory() + fileName + ".usdz")         let options: [String: Any] = [SCNSceneExportDestinationURL: URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)]         if sceneView.scene?.write(to: sceneURL, options: options, delegate: self, progressHandler: {(progress, error, stop) in             if let error = error {                 NSLog("ShareScene \(String(describing: error))")             }         }) != true {             NSLog("ShareScene Unable to write scene to \(sceneURL)")             return nil         }         return sceneURL     }
Topic: Programming Languages SubTopic: Swift Tags:
Oct ’20
Reply to How to disable Metal compiler warnings for SceneKit / ARKit?
The warning logging has been fixed in iOS 14.2, but the performance problems still happen consistently in iOS 14.2 and in the latest macOS 11.0.1 RC2. I decided to dig into the performance problems with Xcode a bit more and basically I found that SceneKit is using MTLDevice.newLibraryWithSource to synchronously compile a roughly 4,200 line (~144KB) Metal shader source string. This is happening in the render loop which is apparently invoked as a CADisplayLink handler, which is why the whole UI hangs for seconds at a time. To verify that this is the problem, I captured one of the SceneKit shader source strings and options with a breakpoint and used them in a simple test program to compile and time it 50 times. On an iPad Pro, each compilation takes about 200 msec. On an iPad 6th Gen, that takes about 340 msec per compilation. This matches what I’m seeing using Instruments in our real SceneKit-based app. It appears that the compilation is happening on the GPU and not the CPU. If no changes are made to the source string between compiles, it appears that MTLDevice keeps a (hash-based?) cache and so the subsequent compilations are more like 6 msec. For the test program, I appended a space character each iteration to the source string, so I was able to force it to recompile every iteration. SceneKit appears to make changes to the source and recompiles it when each set of new nodes with meshes or lights are added to the scene, which again explains what I see with Instruments. Just to see what the what a “minimal” Metal shader compile time is like, I tried it with a simple 24-line source string with only a vertex and fragment shader and it takes about 8 msec per compile. I’m not sure what Apple is going to do to avoid recompiling that four-thousand line source file during frame update, but the current design seems like it doesn’t work well. I've passed along all of this (in more detail) via Feedback to Apple.
Topic: Graphics & Games SubTopic: Metal Tags:
Nov ’20
Reply to How to disable Metal compiler warnings for SceneKit / ARKit?
The shader compile time problem is still happening in the latest iOS 14.3 Beta. I've attached shader compile times using Instruments running our app on an iPad running 14.3 Beta. It's such a pity that with all of Apple's focus on 3D, AR and GPU performance, especially with the new M1 chip-based Macs, that they haven't resolved such a big performance problem yet. When users get frustrated with our app's UI appearing to hang for seconds at a time, they're unlikely to stick around to appreciate the beautiful billions of triangles-per-second rendering. I sure wish we could come up with a workaround for this. Start Duration Stage 00:00.067.901 350.18 ms Compile shader 00:00.483.174 382.15 ms Compile shader 00:00.893.477 383.61 ms Compile shader 00:01.342.543 368.81 ms Compile shader 00:01.713.172 355.37 ms Compile shader 00:02.076.597 400.08 ms Compile shader 00:02.521.364 389.56 ms Compile shader 00:02.911.883 352.88 ms Compile shader 00:03.266.651 347.64 ms Compile shader 00:04.025.355 494.98 ms Compile shader 00:04.527.612 392.55 ms Compile shader 00:04.953.428 408.40 ms Compile shader 00:05.362.909 370.68 ms Compile shader 00:05.736.013 368.20 ms Compile shader
Topic: Graphics & Games SubTopic: Metal Tags:
Nov ’20
Reply to How to disable Metal compiler warnings for SceneKit / ARKit?
Unfortunately I've verified with Instruments that the performance problem still has not been fixed in iOS 14.3 RC. The UI hangs are a really bad experience. In our app loading multiple models into a scene, we see hangs like this being logged in the Console app: com.apple.hangtracer Hang detected: 10.03s (always-on hang reporting) com.apple.hangtracer Hang detected: 1.55s (always-on hang reporting)
Topic: Graphics & Games SubTopic: Metal Tags:
Dec ’20
Reply to How to disable Metal compiler warnings for SceneKit / ARKit?
Graphics and Games Engineer : Thank you for your response. The Metal cache is helpful, but for some reason it is either too small or fails much of the time. During my investigations, for some scenes, the "compile time" is indeed a couple of milliseconds, so it must be hitting the cache. But I cannot figure out a pattern or how to get the cache to work all the time. Is there some way to adjust the size? I see what looks like the cache in Library/Caches/app-id/com.apple.metal/functions.list, functions.data, libraries.list, libraries.data, so I see it written when a scene is loaded and shaders are compiled. Is there doc on how it works? I'm also not sure what you mean by "...after each reboot." At least for our app, SceneKit scenes ARE the app UI, so there really isn't a way to show something else while the shaders compile. I'd be happy if there was some way to just get the shader compilation off the frame refresh (CADisplayLink) so it wouldn't hang the entire app UI. If you have some suggestions on how to achieve that, it'd be super appreciated.
Topic: Graphics & Games SubTopic: Metal Tags:
Dec ’20
Reply to How to disable Metal compiler warnings for SceneKit / ARKit?
arthurfromberlin: Sounds like you're encountering similar problems. You can see it via Instruments / SceneKit by just running a sample app made using the standard Game template in Xcode. BTW: I have tried (and even shipped) many different attempts to use both the synchronous and background versions of the SCNView.prepare method. I have had many problems with both of them. The background version crashes (at least since iOS 13) if the view is removed from the UIWindow (e.g., user changes views). I've debugged this and it's lacking a check for a null window but so far have not been able to convince Apple to fix it (FB7716713 May 27, 2020). Trying to use the synchronous version on a non-main DispatchQueue also crashes randomly and, at least for our app, actually makes it slower when it doesn't crash (FB5418811 Feb 11, 2019). Both of them seem to still cause the the shaders to be compiled during the CADisplayLink frame refresh, so they hang the whole app UI anyway. I've removed all uses of prepare from our app, at least until the bugs are fixed. I agree with your assessment of RealityKit also: not a replacement for the functionality of SceneKit yet with a few too many missing features.
Topic: Graphics & Games SubTopic: Metal Tags:
Dec ’20
Reply to RealityConverter beta 3 loses skin binding - FBX to USDZ
I've also discovered this recently. I've also found that RealityConverter does export all the skeleton animations correctly when the input file is a .GLB or .GLTF. So I've been using the most recent releases of Cheetah3D or Blender to import the .FBX, then export to .GLB then use RealityConverter to export to .USDZ. Not very convenient for lots of models, but at least it seems to work.
Topic: Spatial Computing SubTopic: ARKit Tags:
Feb ’21