为什么不是';t我的iPhone 5显示60+;fps甚至在完全裸露的UITableView卷轴上?
在我的应用程序中,我一直在努力使核心动画工具中的fps达到60以上,同时在iPhone5上滚动我的表格视图。我的GPU没有打开,而且我无法真正识别出任何加快它速度的东西(通过注释或删除nib中的视图) 几个小时后,我终于感到好奇,开始了一个新的垃圾应用程序,除了一个UITableViewController,什么都没有,它只是一遍又一遍地吐出同一个单元格。我在滚动时用1000行分析了这一点,但仍然只有50行 我错过了什么?这不可能是正确的。没有比这张直截了当的表格更简单的了,它显示: 我上传了一个裸体应用程序 有人能证实我没有疯吗 更新为什么不是';t我的iPhone 5显示60+;fps甚至在完全裸露的UITableView卷轴上?,iphone,ios,uitableview,scroll,Iphone,Ios,Uitableview,Scroll,在我的应用程序中,我一直在努力使核心动画工具中的fps达到60以上,同时在iPhone5上滚动我的表格视图。我的GPU没有打开,而且我无法真正识别出任何加快它速度的东西(通过注释或删除nib中的视图) 几个小时后,我终于感到好奇,开始了一个新的垃圾应用程序,除了一个UITableViewController,什么都没有,它只是一遍又一遍地吐出同一个单元格。我在滚动时用1000行分析了这一点,但仍然只有50行 我错过了什么?这不可能是正确的。没有比这张直截了当的表格更简单的了,它显示: 我上传了
60 fps是iPhone上的最高速度吗?核心动画会比这更快吗?在60Hz以上制作动画只会浪费电池。屏幕的刷新速度不会超过这个速度,而且你的眼睛无法分辨60赫兹以上的运动 所以我认为这里的答案是我的期望是不正确的 我读到的每一篇文章似乎都在说,你想让你的应用程序达到每秒60帧的速度。我没有意识到这实际上是最高的每秒每秒,而且你基本上永远不会得到稳定的每秒60帧 在instruments中评测了一系列其他应用程序(我没有意识到我可以在应用商店中的其他人的应用程序上进行评测)之后,似乎大多数应用程序(构建良好的应用程序)的表视图在滚动时都徘徊在从低到高的50度之间。Path是迄今为止我发现的一个例外,它几乎锁定在59或60,这对于它们渲染的所有内容来说都是难以置信的 因此,我似乎真的应该对50+fps感到非常满意。一些想法:
- 如果你通过仪器测量它
- 使用调试构建进行测试;或
- 从Xcode启动应用程序,而不是从设备本身启动
fpsLabel
,该标签每秒用CADisplayLink
更新一次(或者如果您有自定义绘图例程,您可以在那里进行自己的fps计算):
@界面视图控制器()
@属性(非原子)CFTimeInterval previousTimestamp;
@属性(非原子)NSInteger帧计数;
@结束
@实现视图控制器
-(无效)viewDidLoad
{
[超级视图下载];
self.previousTimestamp=CFAbsoluteTimeGetCurrent();
CADisplayLink*displayLink=[CADisplayLink displayLink WITHTARGET:自选择器:@selector(handleDisplayLink:)];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop]forMode:NSRunLoopCommonModes];
}
-(无效)handleDisplayLink:(CADisplayLink*)displayLink;
{
CFTimeInterval now=CFAbsoluteTimeGetCurrent();
CFTimeInterval appeased=now-self.previousTimestamp;
frameCount++;
如果(经过时间>1.0)
{
CGFloat fps=self.frameCount/appeased;
dispatch\u async(dispatch\u get\u main\u queue()^{
self.fpsLabel.text=[NSString stringWithFormat:@“%.1f fps”,fps];
});
self.previousTimestamp=now;
self.frameCount=0;
}
}
总之,在发布构建条件下(即未链接到计算机,运行非调试构建),结合更精确的测量(通过代码),我认为您会发现iPhone 5上的表视图性能非常出色,锁定在60 fps。但是,即使你的用户界面下降到每秒50秒左右,我个人认为这仍然很好。你仍然可能受到CPU的限制(它用于布局等),但在这种情况下,我假设你的滚动速度不够快,足够长,屏幕必须经常更新。如果不滚动,仪器将显示0fps(因为屏幕根本不更新)。如果你真的担心,我建议在滚动时查看GPU利用率%和时间分析器。只要你不是max,那么你几乎在所有情况下都会没事的。谢谢David,但我绝对不会滚动得不够长/不够快。我在上面的应用程序中放了10000行,然后在iPhone5上快速浏览。我认为CPU不可能与简单的应用程序绑定在一起。我真的创建了一个赤裸裸的应用程序,只有一个TableViewController(故事板中输入的第一件事)。然后我只使用了一个普通的单元(当然是出列的),就是这样。一些非常奇怪的事情正在发生,比如仪器测量错误。你用的是NSLog吗?我发现,当我启用NSLog时,我的FPS会大幅下降…^而不是在没有NSLog的情况下在手机上断开与计算机的连接运行应用程序。这真的是个问题吗?这听起来像是过早优化的极端情况。还有,别忘了测量这些东西的动作会减慢速度。我知道
@interface ViewController () <UITableViewDataSource>
@property (nonatomic) CFTimeInterval previousTimestamp;
@property (nonatomic) NSInteger frameCount;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.previousTimestamp = CFAbsoluteTimeGetCurrent();
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}
- (void)handleDisplayLink:(CADisplayLink *)displayLink;
{
CFTimeInterval now = CFAbsoluteTimeGetCurrent();
CFTimeInterval elapsed = now - self.previousTimestamp;
self.frameCount++;
if (elapsed > 1.0)
{
CGFloat fps = self.frameCount / elapsed;
dispatch_async(dispatch_get_main_queue(), ^{
self.fpsLabel.text = [NSString stringWithFormat:@"%.1f fps", fps];
});
self.previousTimestamp = now;
self.frameCount = 0;
}
}