首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >贴图贴图的快速绘制

贴图贴图的快速绘制
EN

Stack Overflow用户
提问于 2013-08-20 11:55:03
回答 2查看 572关注 0票数 0

我正试图加快我的应用程序中地图块的绘制速度,因为Profiler说这是应用程序运行速度最慢的地方。项目文件是这里,时间分析器说的最慢的部分是project :zoomScale:inContext方法的这一部分,用于平铺覆盖

代码语言:javascript
复制
for (ImageTile *tile in tilesInRect) {
    CGRect rect = [self rectForMapRect:tile.frame];

    NSString *path = tile.imagePath;
    if (path) {
        UIImage *image = [UIImage imageWithContentsOfFile:path];

        CGContextSaveGState(context);
        CGContextTranslateCTM(context, CGRectGetMinX(rect), CGRectGetMinY(rect));

        float scale = (overZoom/zoomScale);

        CGContextScaleCTM(context, scale, scale);
        CGContextTranslateCTM(context, 0, image.size.height);
        CGContextScaleCTM(context, 1, -1);
        CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), [image CGImage]);
        CGContextRestoreGState(context);
    }
}

我猜想,使用任何UIImages并对它们进行缩放是最慢的事情。有没有任何方法来加快速度,或将绘图移到后台线程?(尽管drawMapRect不会在后台线程中发生,因为它不会在应用程序每次加载瓷砖时停止地图滚动)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-21 04:15:20

是的,drawMapRect已经在多个线程上运行,直接从后台线程调用任何绘图代码都是错误的做法,不会提高速度或响应能力。代码中的瓶颈很可能是绘图函数CGContextDrawImage,如果您已经确定只绘制与传递到drawMapRect:的mapRect相交的绘图块,那么您可能无法做太多的事情。然而,您正在从多个线程中反复调用UIImage的方法imageWithContentsOfFile,我不认为这会像imageNamed:方法那样缓存图像数据。解决这个问题可能会加快速度。然而,根据我的经验,如果分析器告诉您它正在将大部分时间用于drawMapRect:方法,您就不应该感到恐慌。因为它被取消了主线程,而且地图仍然响应用户交互,所以优化它通常不会大大改善用户的体验。

票数 1
EN

Stack Overflow用户

发布于 2013-08-20 15:55:42

不确定它是否会更快,但如果您处理多个瓷砖,则可以尝试并行化操作。如果您需要在tilesInRect中偏移和/或裁剪许多块,您可以使用Grand Central Dispatch或NSOperationQueue同时执行多个这样的操作,然后进行最后的组装步骤。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18334363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档