Since we are talking about programmatically
, Instruments are not under my consideration.
Some reference listed in advance:
- Calculate fps (frames per second) for iphone app
- Display FPS on iOS onscreen (without Instruments)
- At what framerate does the iOS UI run animations at?
1. Using CADisplayLink
According to the doc,
The duration property provides the amount of time between frames. You can use this value in your application to calculate the frame rate of the display...
So in my demo project, I add a displayLink to mainRunLoop for UITrackingRunLoopMode:
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(screenDidUpdated)];
[self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:UITrackingRunLoopMode];
and use duration
to calculate FPS. But out of my expectation, the duration
is always 0.016667 (~ FPS 60) not matter the tableView scrolls smoothly or not.
How I make the tableView lag is to add one line in - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
:
NSData *data = [NSData dataWithContentsOfURL:url];
Then I turned to displayLink.timestamp
, and it worked.
2. Observing drawRect:
?
My second idea is to observe drawRect:
, I thought when the tableView scrolls, its drawRect:
would be called frame by frame, then I could calculate the FPS according to the time diff between drawRect:
callings.
But it failed, cause the drawRect:
was called only once (while cells for many times). This way is similar to Using CADisplayLink
, but maybe I chose the wrong position/method(like drawRect:
) to observe, any recommended method for me to observe?
Questions:
- How the Instruments measure the FPS accurately?
- Is the doc said
using duration to calculate FPS
wrong? - What's the right/best method to observe to calculate the FPS?
Thanks!