Metal App FPS drops in Debug but fine in Instruments while profiling - ios

I am using Metal for rendering live video frames plus some custom control (a circular slider) for zooming that I implemented using Quartz 2D API. When I run the app in debugger, I see FPS drop from 30 to sometimes 11 and zoom is not smooth on older devices such as iPad Mini 2. I then run the code in Time Profiler and surprisingly, there is no fps drop in Time Profiler. App runs smooth in Profiler. How do I know what is causing fps drop in debug?

It's probably the Metal Validation layer that's active for your debug scheme. It's not typically surprising that performance of programs is worse in general when debugging (due to lack of optimizations, or asserts being enabled, etc.).
If you want to get similar Metal performance when debugging, you can try disabling the Metal Validation in the scheme settings. But, then, of course, you lose the actual debugging benefit of the validation of your use of Metal.

Related

Metal performance debugging

I have a Metal application on iOS where I take video frames and pass each frame through a number of shaders, some are compute shaders applied in multiple passes and 4 of them are independent MTKViews which display computed textures (example, Histogram) along with video preview. Sometimes (but not always) on older hardware such as iPhone 6s, I notice the app has become too sluggish with frame rate dropping to 1 or 2 frames per second. Please let me know how to debug which Metal shaders are clogging the GPU/GPU and how do I optimize the performance of Metal related code.
Run your application in Xcode.
Select Debug -> Capture GPU frame
Select Issue Navigator from the left toolbar
Select Runtime
Fix the listed issues, at least "high" priority.
You can also see where the performance is being spent by looking at drawPrimitives etc. times in the debug navigator on the left.
To view a shader's performance details, select the draw or dispatch call from the event list on the left. There's a "performance" section.

iOS games with random frame drops (including my game)

I'm almost finishing my iOS game written in Swift + SpriteKit.
It's a quite simple game, 30-32 nodes at max. Only 1 thing has physics. The rest is a few animated clouds (around 6). The CPU usage is around 2-3% and max RAM usage of 75-80MB.
Including that I also get frame drops when changing from one scene to another. Why that could be?
(I'm pre-loading all the textures and sounds during game init, and not on the scenes)
When I use the simulator for 5S up to 6S Plus, I don't see any frame drop in there. So that's weird. Looks like it's not my game but my iPhone 6S?
Now, I do also have other games installed on the same device from different developers, and I frequently get random frame drops too. Lags for 2-3 seconds and then comes back to 60fps.
Does anyone know if this is something that's happening after an X iOS update ? or I was even thinking this my be some kind of background service running that's killing my phone. Call it facebook, whatsapp, messenger, etc.
Is there any way I could possibly check on what's going on?
Was this caused by the way that newer versions of SpriteKit are defaulting to Metal render mode as compared to OpenGL mode? For example, do your problems go away when PrefersOpenGL=YES is added to Info.plist? I covered a bit of this performance issue in my blog post about a SpriteKit repeat shader. Note that you should only be testing on an actual iOS device, not the simulator.

Core Animation profiling: When an app is idle, should it be 0fps of 60fps?

I've been trying to optimize scrolling of my UICollectionView, and the Core Animation profiler has me puzzled...
When the app is idle (no scrolling or interaction in anyway) I'm averaging around 59-60 fps, but occasionally it will drop down to 7 or 12 fps:
Is this expected behavior? Because I'm not interacting with the app when this drop happens I don't visually see anything, but I'm curious if this is something I should be troubleshooting.
Other times when profiling core animation bottlenecks I've seen fps drop down to 0 fps when idle/not interacting with the app.
The app isn't crash or freezing, so is this some sort of bug in Instruments? (I'd expect consistently to be 0fps or close to 60fps when nothing is happening in the app).
Update:
Here's an example of the FPS graph after running the profiler a few minutes later (I'd tried turning on rasterization for a type of view, but then reverted back to not rasterizing, so although the project was rebuilt, the codebase is the same):
Here I'm getting between 32 and 55 fps when interacting with the app, and dropping down to 0 fps when idle.
From my subjective perspective I'm not noticing anything major between what I'm seeing between these two examples, but from Xcode's perspective I'm seeing two different stories.
Does anyone know what's happening here?

performance issues with air app on iphone 4

Currently I am working on an Air app for iOS and Android. Air 3.5 is targeted.
Performance on iPhone 4 / 4s has been acceptable overall, after a lot of optimising: gpu rendering, StageQuality.LOW, avoiding vectors as much as possible etc. I really put a lot of effort in boosting performance.
Still, every once in a while, the app becomes very slow. There is no precise point in time or action or combination of actions after which this occurs. Sometimes, it doesn't occur for days. But when it occurs, only killing the app and launching it again helps, because the app stays slow after that. So I am not talking about minor hiccups that
The problem occurs only on (some) iPhones 4 and 4s. Not on iPad 3,4, iPhone 5, any Android device...
Has anyone had similar experiences and pointers as to where a solution might be found?
What happens when gpu memory fills up? Or device memory? Could this be involved?
Please don't expect Adobe Air to have performance as Native Apps. I am developing App with Adobe Air as well.
By the sound of your development experience. I think it's to do with memory issue, because the performance is not too bad at the begging stage, but it gets bad overtime (so u have to kill the app). I suggest you looking into memory leaking issue.
Hopefully my experience can help you.
I had a similar problem where sometime during gameplay the framerate would drop from 30fps to an unrecoverable 12fps. At first I thought I was running out of GPU memory and it was falling back on rendering with CPU.
Using Adobe Scout I found that when this occurred, the rendering time was ridiculousness high.
Updating to Air 3.8, I fixed the problem by limiting the amount of bitmaps that were being rendered and in memory at once. I would only create new instances of backgrounds for appropriate levels, and then flagging them for garbage collection when the level ended, waiting a few seconds and then moving to the next level.
What might solve your problem is if you reduce the amount of textures you have in memory at one time, only showing the ones you need to. If you want to swap out active textures for new ones, set all the objects with that texture data to null:
testMovieClip = null;
and remove all listeners from it so that garbage collection will pick it up.
Next, you can force garbage collection with AIR:
System.gc();
Instantiate the new texture you want to render a few frames after calling gc. Monitor resources with Scout and the iOS companion app to confirm that it's working.
You could also try to detect when the framerate drops, and set some objects to null then force garbage collection. In my case, if I moved my game to an empty frame for a few seconds with garbage collection, the framerate would recover and the game would resume rendering with GPU.
Hope this helps!

Is there any way to accelerate iPad simulator's OpenGL performance?

iPad simulator is too slow to test OpenGL graphics. Is there any way to make it faster?
In my experience, the iPad Simulator has almost always been faster than running on an actual device. On my early 2010 i7 MacBook Pro, the Simulator has been significantly faster than the iPhone 4 and iPad 1 with almost every OpenGL ES application I've developed.
The Simulator does appear to do software-based simulation of certain iOS hardware features, particularly in the area of shaders. If you have a shader-heavy OpenGL ES 2.0 application, you can see a significant drop-off in performance when running in the Simulator.
In particular, the Simulator can't match the rendering speed of the iPad 2 when it comes to fill-rate-limited OpenGL ES applications, because the iPad 2 has a GPU that excels at this.
Beyond telling you to buy a faster computer, there's nothing that can be done to speed up the Simulator. As long as it has to simulate certain operations in software, you're going to get a little slower performance when doing certain types of rendering when compared to the very latest iOS devices. You're welcome to file an enhancement request at http://bugreport.apple.com to ask for performance improvements, but I don't know how much better the team at Apple can make this. They seem fairly conscious of performance issues from what I've seen.
As always, the Simulator should be used to test if something works at all, and all actual fine-tuning and anything else performance related should be done on actual hardware. I've found that the build-install-test cycle on the iPad 2 was almost as fast as dealing with the Simulator when I was developing my last application.

Resources