Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不是';t我的iPhone 5显示60+;fps甚至在完全裸露的UITableView卷轴上?_Iphone_Ios_Uitableview_Scroll - Fatal编程技术网

为什么不是';t我的iPhone 5显示60+;fps甚至在完全裸露的UITableView卷轴上?

为什么不是';t我的iPhone 5显示60+;fps甚至在完全裸露的UITableView卷轴上?,iphone,ios,uitableview,scroll,Iphone,Ios,Uitableview,Scroll,在我的应用程序中,我一直在努力使核心动画工具中的fps达到60以上,同时在iPhone5上滚动我的表格视图。我的GPU没有打开,而且我无法真正识别出任何加快它速度的东西(通过注释或删除nib中的视图) 几个小时后,我终于感到好奇,开始了一个新的垃圾应用程序,除了一个UITableViewController,什么都没有,它只是一遍又一遍地吐出同一个单元格。我在滚动时用1000行分析了这一点,但仍然只有50行 我错过了什么?这不可能是正确的。没有比这张直截了当的表格更简单的了,它显示: 我上传了

在我的应用程序中,我一直在努力使核心动画工具中的fps达到60以上,同时在iPhone5上滚动我的表格视图。我的GPU没有打开,而且我无法真正识别出任何加快它速度的东西(通过注释或删除nib中的视图)

几个小时后,我终于感到好奇,开始了一个新的垃圾应用程序,除了一个UITableViewController,什么都没有,它只是一遍又一遍地吐出同一个单元格。我在滚动时用1000行分析了这一点,但仍然只有50行

我错过了什么?这不可能是正确的。没有比这张直截了当的表格更简单的了,它显示:

我上传了一个裸体应用程序

有人能证实我没有疯吗

更新
60 fps是iPhone上的最高速度吗?核心动画会比这更快吗?

在60Hz以上制作动画只会浪费电池。屏幕的刷新速度不会超过这个速度,而且你的眼睛无法分辨60赫兹以上的运动

所以我认为这里的答案是我的期望是不正确的

我读到的每一篇文章似乎都在说,你想让你的应用程序达到每秒60帧的速度。我没有意识到这实际上是最高的每秒每秒,而且你基本上永远不会得到稳定的每秒60帧

在instruments中评测了一系列其他应用程序(我没有意识到我可以在应用商店中的其他人的应用程序上进行评测)之后,似乎大多数应用程序(构建良好的应用程序)的表视图在滚动时都徘徊在从低到高的50度之间。Path是迄今为止我发现的一个例外,它几乎锁定在59或60,这对于它们渲染的所有内容来说都是难以置信的

因此,我似乎真的应该对50+fps感到非常满意。

一些想法:

  • 我对此非常敏感,但在我看来,高50是非常好的

  • 当我使用代码(比仪器更精确)对此进行基准测试时,iPhone5上的纯文本表格视图被锁定在60.0 fps,因此我对你的“高50秒”数字表示怀疑。如果出现以下情况,您的性能可能会降低:

    • 如果你通过仪器测量它

    • 使用调试构建进行测试;或

    • 从Xcode启动应用程序,而不是从设备本身启动

  • 为了对不同帧速率下的用户体验有一点定性的了解,我通过在我的表视图的背景中加载图像来缓慢降低性能,然后通过在前景中执行这个计算代价高昂的过程来进一步降低性能。我不会告诉你那些血淋淋的细节,但在我看来,50年代中期及以上的帧速率都非常平滑,我开始注意到(但并不可怕)帧速率下降到30-40 fps,而随着帧速率下降到5-15 fps,用户体验变得完全不可接受。你应该自己做实验,但是有好的设计,应该能够保持在50岁以上,但低到50岁左右可能是好的

  • 仪器可能无法提供最精确的测量。我可以用代码来衡量它。我在屏幕上的一个备用点上放置了一个
    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;
        }
    }