2012-05-16 12 views
5

をしないのですような気がしますここで私はコアグラフィックスにテキストを表示するために使用するコードです:私が表示したい場合ははコアグラフィックステキストがコア・テキストよりも道高速です - 私は何か

int y = MESSAGE_FRAME.origin.y + 8; 

if (month) y = y + 27; 
int height = [JHomeViewCellContentView heightOfMessage:self.entry.message]; 

CGRect rect = CGRectMake(MESSAGE_FRAME.origin.x + 8, y, MESSAGE_FRAME.size.width - 16, height); 

UIFont *font = [UIFont fontWithName:@"Crimson" size:15.0f]; 

[[UIColor colorWithWhite:0.2 alpha:1.0] setFill]; 

[self.entry.message drawInRect:rect withFont:font lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentLeft]; 

そしてここでは、コードですコアテキスト内の同じテキスト:

CGRect rect2 = CGRectMake(MESSAGE_FRAME.origin.x + 8, self.bounds.size.height - y - height + 2, MESSAGE_FRAME.size.width - 16, height); 


    UIFont *font = [UIFont fontWithName:@"Crimson" size:15.0f]; 
    CGFloat lineHeight = [font lineHeight]; 

    CTFontRef fontRef = CTFontCreateWithName((CFStringRef)@"Crimson", 15.0f, NULL); 

    CGFloat lineSpacing = 0; 

    CTParagraphStyleSetting settings[] = { 
     { kCTParagraphStyleSpecifierMinimumLineHeight, sizeof(lineHeight), &lineHeight }, 
     { kCTParagraphStyleSpecifierMaximumLineSpacing, sizeof(lineSpacing), &lineSpacing }, 

    }; 

    CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(settings, sizeof(settings)/sizeof(settings[0])); 

    NSMutableDictionary *attDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
            (__bridge_transfer id)fontRef, (NSString *)kCTFontAttributeName, 
              (id)[[UIColor colorWithWhite:0.2 alpha:1.0] CGColor], (NSString *)kCTForegroundColorAttributeName, 
              paragraphStyle, kCTParagraphStyleAttributeName, 
              nil]; 

    NSAttributedString *attString = [[NSAttributedString alloc] initWithString:self.entry.message attributes:attDictionary]; 

    //Flip the coordinate system 
    CGContextSetTextMatrix(context, CGAffineTransformIdentity); 
    CGContextTranslateCTM(context, 0, self.bounds.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 



    CGMutablePathRef path = CGPathCreateMutable(); 
    CGPathAddRect(path, NULL, rect2); 


    self.framesetter = CTFramesetterCreateWithAttributedString((__bridge_retained CFAttributedStringRef)attString); 
    CTFrameRef theFrame = CTFramesetterCreateFrame(self.framesetter, CFRangeMake(0, [attString length]), path, NULL); 

    CFRelease(path); 

    CTFrameDraw(theFrame, context); 
    CFRelease(theFrame); 

どうやら、よりlongwindedているにもかかわらず、コアテキストが、私はそれを行う方法を学んだ理由であるコアグラフィックス、より速いことを意味しています。しかし、このコードを計測器で実行すると、コアグラフィックは5ms、コアテキストは14msで実行されます。私はここで何かを逃しているように感じる。 drawInRectはほぼ3倍速く、遅くなるはずです。私は方法を知っている限り、コードを洗練しましたが、私は専門家ではなく、何か助けていただければ幸いです。

明確にするために、私はテキストのブロックをビューに描画しています。それが私がしたいことです。そして、すべてのテキストが同じ外観を持っています。

+0

コアテキストの強度はテキストレイアウトであり、その下にある描画コードはコアグラフィックスに実装されていますが、単純なテキスト描画でどのように高速化できるかはわかりません。 – overboming

答えて

2

私はCTのものを使用しませんが、あなたが不変のフォントやその他の属性をすべての描画に設定しているように見えます。コメント「座標系を裏返して、attStringをキャッシュします。

良く頭に頭検査のために速度を向上させる必要があるまで、あらゆるアップを因数分解してみてください。

+0

問題は、属性は同じですが、文字列自体は毎回変更されます。あなたはNSMutableAttributedStringの文字列を設定できないとき、私はそれをキャッシュするでしょうか? – Andrew

+0

私は参照してください。うーん。それらの属性のどれも文字レベルを参照していないので、1つの考え方は、可変属性の文字列内のすべてのバイトを置き換えることですが、それは概略的に聞こえます。少なくとも、attDictionaryをキャッシュすることができます(大部分の作業はそこにあります)。そのあと、変更不可能な属性付き文字列を毎回割り当てることができます。 – danh

1

NSMutableAttributedStringはあなたが て文字列を変更できませんreplaceCharactersInRange:withString:

あなたは属性の辞書を設定したら、あなたは経由で属性付き文字列にさらに文字列の更新を制限することができます。 [myAttString replaceCharactersInRange:NSMakeRange(0、myAttString.text.length)withString:NEWSTRING]

とダーティな矩形を描画します。また、CGContextSetTextMatrixは、CTFrameDrawを使用しているときはほとんどないことを意味しています。

もう1つの簡単な注記では、CTFontRefとCTParagraphStyleRefのリリースはありません。彼らはまた、 "ルールの作成"に従い、CFRelease()にする必要があります。

私は自分のコアテキスト学習曲線に苦しんでおり、有望な成果をあげているようです。私はあなた自身の最適化があなたに同様の希望を与えることを願っています。

関連する問題