【问题标题】:CATiledLayer & retina displayCATiledLayer 和视网膜显示
【发布时间】:2012-03-16 19:47:20
【问题描述】:

有没有人有任何技巧可以提高 CATiledLayer 在视网膜显示器上的性能?

这篇文章: CATiledLayer in iPad retina simulator yields poor performance

暗示模拟器存在问题,但我注意到实际设备上的性能也很差。这是一个非常明显的问题,因为它会更快地在视网膜显示器上加载更大的图块。我唯一能做的就是重新处理具有更多细节层次的平铺图像。

我做了一个小技巧:

    CGFloat scale = CGContextGetCTM(context).a / self.contentScaleFactor;

在计算规模时,但这似乎不足以应对性能不佳的情况。

【问题讨论】:

  • 只是确认我在硬件上看到了同样的问题。 CATiledLayer 在我的 iPad 2 上似乎比在我的 iPad 3 上工作得更好。不确定这是由于我的代码中的错误,还是一些潜在的问题。
  • 覆盖-(void)didMoveToWindow { [super didMoveToWindow]; self.contentScaleFactor = 1; }。简短的故事是 CATiledLayer 已经基于屏幕像素(不是“点”)工作。更多讨论here

标签: ios core-graphics retina-display


【解决方案1】:

在我的平铺视图上:

- (id)initWithImageName:(NSString *)name size:(CGSize)size
{

    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {

        size = CGSizeMake(size.width*2, size.height*2);

    }

    if ((self = [super initWithFrame:CGRectMake(0, 0, size.width, size.height)])) {

        CATiledLayer *tiledLayer = (CATiledLayer *)[self layer];

        tiledLayer.levelsOfDetail = 4;
        if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {

            tiledLayer.tileSize = CGSizeMake(512, 512);
        }

    }

    return self;
}

这让 iPad 3 对我来说就像 iPad 2 一样工作。如果你正在做其他事情,比如覆盖数据等,那么你可能需要做更多的争论。实际上,这只会使内容的大小和图块的大小加倍,从而抵消视网膜显示的效果。

您可能还想更改视网膜的最大和最小缩放比例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多