CATiledLayer在iPad 3 Retina显示屏上的PDF性能较差

27

我正在使用简单的代码在滚动视图中显示可缩放的PDF文档,它在iPad 2和原始iPad上运行得非常好。但是在iPad 3上速度非常慢。我知道我在推动更多像素,但渲染性能简直无法接受。

在iOS 5.0及更高版本中,tileSize属性被任意地限制在1024,这意味着在retina显示屏上,瓦片大小只有一半。有人找到克服这个限制的方法了吗?

否则,有人找到了提高iPad 3上CATiledLayer速度的方法吗?


2
请参考以下链接:https://dev59.com/Ymkw5IYBdhLWcg3wus_K - Mat
1
Mat指向的问题有一个解决方法可以解决你的问题。查看所有答案,因为有一个更好的解决方法可用于你的情况,比接受的答案中提供的更好。 - Mihai Timar
谢谢,Mihai。不幸的是,那个链接并没有一个解决方法;只有一些微调。而且这些大多数都是针对模拟器的,因此对于我们开发设备本身的人来说并不是很有趣。例如,一个微调建议将contentScaleFactor降低到0.5,这会导致图层以iPad 2(非视网膜)分辨率呈现。更快,是的,但对于一个出货产品来说是不可接受的。 - dkmp
两个建议:你能否创建一个小的演示项目和一个代表性的PDF文件,并将其发布到Dropbox上?此外,您可能希望提供赏金作为激励去挖掘。 - David H
你是否记得将视图的contentScaleFactor设置为1(或等效地,将层的contentScale设置为1)?最好在-didMoveToWindow中进行设置(在[super didMoveToWindow]之后,将其设置为当前屏幕的任何内容)。 - tc.
2个回答

1
你尝试过在图层上设置shouldRasterizeYES吗?

当然,将图层光栅化可以提高性能。但是,光栅化消除了平铺图层的好处:随着图像缩放重新绘制瓷砖。在任何大于1.0的缩放级别下,光栅化瓷砖看起来都很糟糕。 - dkmp

0

你对这些绘图运行了时间分析器,并排除了冗余绘图的可能性吗?

我有一些奇怪的双重绘图,可以使用以下方法轻松找到:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
    NSLog(@"draw %@", NSStringFromCGRect(CGContextGetClipBoundingBox(context)));
    // draw pdf
}

还有许多设置可以玩耍:

  • tiledLayer.levelsOfDetail = 2
  • tiledLayer.levelsOfDetailBias = 4
  • tiledLayer.tileSize = self.bounds.size
  • CGContextSetInterpolationQuality(context, kCGInterpolationLow)
  • CGContextSetRenderingIntent(context, kCGRenderingIntentDefault)
  • self.contentScaleFactor = 1.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接