您好,匿名用户
随意问技术百科期待您的加入

为什么同一段drawrect中的代码,在不同的环境下运行效率不同

0 投票
先是背景

开发过程中遇到UItableview优化无能的情况,滑动的时候总感觉有点钝。
按照如下的方法,我进行了优化
主要是这两篇文章:http://www.keakon.net/2011/08/03/%E4%...
http://fann.im/blog/2012/09/11/uitabl...
还有这个例程包中的最后一个工程:
http://developer.apple.com/library/io...

在按照这些方法写改以后,确实好了不少。主要是自己写了个cellview,重写了drawrect方法来绘制自己需要定制的内容,而不是给cell上addsubview。但滑动的时候还是有点钝。

下面是问题的核心了~~~

我今天跟如上链接的官网例程做了仔细的对比,发现,把我的drawrect代码 贴到它对应的drawrect中去,效果是不错的,当然cell中要绘制的String都是用@"xyz"这个简单的字符串代替的。

为了控制变量,我把我自己的代码中涉及到展示String数据的部分也改成了@"xyz"。

运行后,计时数据显示,我自己的app框架下,那段代码执行的时间比放在例程中执行的时间要多1/3左右。都是用真机测试的。

这个让我很不解,为什么同样的代码在两个环境下会有不同的效率呢?

我的drawrect方法代码如下:

- (void)drawRect:(CGRect)rect {
	
    static int i;
    static uint64_t count;
	uint64_t start = mach_absolute_time();
    
#define LEFT_COLUMN_OFFSET 10
#define LEFT_COLUMN_WIDTH 130
	
#define MIDDLE_COLUMN_OFFSET 140
#define MIDDLE_COLUMN_WIDTH 110
    
#define RIGHT_COLUMN_OFFSET 270
	
#define UPPER_ROW_TOP 8
#define LOWER_ROW_TOP 34
	
#define MAIN_FONT_SIZE 18
#define MIN_MAIN_FONT_SIZE 16
#define SECONDARY_FONT_SIZE 12
#define MIN_SECONDARY_FONT_SIZE 10
    
	// Color and font for the main text items (time zone name, time)
	UIColor *mainTextColor = nil;
	UIFont *mainFont = [UIFont systemFontOfSize:MAIN_FONT_SIZE];
    
	// Color and font for the secondary text items (GMT offset, day)
	UIColor *secondaryTextColor = nil;
	UIFont *secondaryFont = [UIFont systemFontOfSize:SECONDARY_FONT_SIZE];
	
    mainTextColor = [UIColor blackColor];
    secondaryTextColor = [UIColor colorWithRed:0x9a/255.0 green:0x9a/255.0 blue:0x9a/255.0 alpha:1];
    
    
	// Choose font color based on highlighted state.
    if (self.highLighted) {
        [CHYTableViewCellSelectedColor set];
        UIRectFill(self.frame);
	}

    CGPoint point;
    
    // Set the color for the main text items.
    [mainTextColor set];
    point = CGPointMake(35, 5);
    [self.contactListCellData.name drawAtPoint:point forWidth:150 withFont:mainFont minFontSize:16 actualFontSize:NULL lineBreakMode:UILineBreakModeTailTruncation baselineAdjustment:UIBaselineAdjustmentAlignBaselines];
    
    // Set the color for the secondary text items.
    [secondaryTextColor set];

    if (_contactListCellData.subTitle != nil && ![_contactListCellData.subTitle isEqualToString:@""]) {
        point = CGPointMake(36, 28);
        [_contactListCellData.subTitle drawAtPoint:point forWidth:135 withFont:secondaryFont minFontSize:13 actualFontSize:NULL lineBreakMode:UILineBreakModeTailTruncation baselineAdjustment:UIBaselineAdjustmentAlignBaselines];
    }
    
    if (_contactListCellData.rightLabelStr != nil && ![_contactListCellData.rightLabelStr isEqualToString:@""]) {
        point = CGPointMake(210, 15);
        [_contactListCellData.rightLabelStr drawInRect:CGRectMake(180, 15, 115, 25) withFont:secondaryFont lineBreakMode:NSLineBreakByTruncatingTail alignment:NSTextAlignmentCenter];
    }
    //line
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextBeginPath(context);
    CGContextMoveToPoint(context, 0, self.frame.size.height- 0.25);
    CGContextAddLineToPoint(context, UI_SCREEN_WIDTH, self.frame.size.height- 0.25);
    CGContextClosePath(context);
    [[UIColor colorWithRed:0xaa/255.0 green:0xaa/255.0 blue:0xaa/255.0 alpha:1.0] setStroke];
    CGContextSetLineWidth(context, 0.5);
    CGContextStrokePath(context);
    
    
    CGContextMoveToPoint(context, 0, 0.25);
    CGContextAddLineToPoint(context, UI_SCREEN_WIDTH,  0.25);
    CGContextClosePath(context);
    [[UIColor colorWithRed:0xff/255.0 green:0xff/255.0 blue:0xff/255.0 alpha:1.0] setStroke];
    CGContextSetLineWidth(context, 0.5);
    CGContextStrokePath(context);
 
    
    uint64_t drawTime = mach_absolute_time() - start;
    
    i ++;
    count += drawTime;
    if (i > 50) {
        NSLog(@"TEST:%lld [%d] ", count / i, i);
    }
}
用户头像 提问 2012年 12月1日 @ 卫宫士郎 上等兵 (173 威望)
分享到:

1个回答

0 投票
 
最佳答案

给自己结个题。

问题出在其他部分的代码上,我给tableview所在的viewcontroller的view的CALayer加了shadow的渲染。去掉就好了。
这种calayer层的渲染也很费资源啊。。看来得仔细研究下这些图形渲染机制

用户头像 回复 2012年 12月1日 @ Lee Sin 上等兵 (347 威望)
选中 2012年 12月1日 @卫宫士郎
提一个问题:

相关问题

0 投票
1 回复 2 阅读
0 投票
0 回复 18 阅读
0 投票
1 回复 41 阅读
0 投票
1 回复 52 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...