为什么即使在完全裸露的UITableView滚动条上我的iPhone 5也没有显示60 fps?

在我的应用程序中,我一直在努力让我的fps在核心动画工具中超过60,同时在iPhone 5上滚动我的桌面视图.我的GPU没有点击,我无法确定任何加速它的东西(通过注释或删除笔尖中的视图).

几个小时后,我终于好奇并开始了一个新的垃圾应用程序,只有一个UITableViewController只是反复吐出相同的单元格.我在滚动时用1000行描述了这个,而STILL只得到了高50.

我在这里错过了什么?没有办法是正确的.它没有比这个直接表显示更简单:

我上传了一个准系统应用程序here.

有人可以确认我不是疯了吗?

更新

你可以在iPhone上获得60fps的最大值吗?核心动画会比这更快吗?

几点想法:

>我对此非常敏感,但在我看来,50岁以上是非常好的.
>当我使用代码(比仪器更准确)对此进行基准测试时,iPhone 5上的纯文本tableview被锁定在60.0 fps,所以我对你的“高50”数字持怀疑态度.如果出现以下情况,您的表现可能会降低

>如果你通过仪器测量它;
>您的测试是否使用调试版本;要么
>从Xcode推出应用程序,而不是从设备本身启动它.

>为了获得不同帧速率的UX定性感,我在桌面视图的后台进行图像加载会慢慢降低性能,然后通过在前台执行这个计算成本高昂的过程进一步降级.我会给你留下血腥的细节,但在我看来,在50年代中期及以上的帧速率都是丝滑的,我开始注意到(但并不可怕)帧速率,因为它下降到30 -40 fps,随着帧速率下降到5-15 fps,UX变得完全不可接受.你应该自己试验一下,但是设计好,应该能够保持50多岁,但是低至50年代中期可能就好了.
>仪器可能无法为您提供最准确的测量.我可以在代码中测量它.我在屏幕上的一个备用点放了一个fpsLabel,每秒用CADisplayLink更新一次(或者如果你有自定义绘图程序,你可以在那里进行自己的fps计算):

@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;
    }
}

底线,在发布版本条件下(即没有链接到计算机,运行非调试版本)更精确的测量(通过代码)的组合,我认为你会发现iPhone 5上的表视图性能非常好,锁定在60帧/秒.但即使你的用户界面下降到50s fps,我个人认为这仍然很好.

本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院